Итак, в настоящее время у меня есть структура, которая принимает перечисление как тип. Ниже представлена структура со свойством itemType.
struct FormPickerItem: FormItem {
let id: String
var title: String
let itemType: Any.Type
var margin: UIEdgeInsets
var size: CGSize?
}
Структура моего перечисления следующая.
enum UserGoal {
case all
case buildMuscle
case strength
case none
}
extension UserGoal: EnumItem {
typealias RawValue = String
init?(rawValue: RawValue) {
switch rawValue {
case "All": self = .all
case "Build Muscle": self = .buildMuscle
case "Strength": self = .strength
case "None": self = .none
default: return nil
}
}
var rawValue: RawValue {
switch self {
case .all: return "All"
case .buildMuscle: return "Build Muscle"
case .strength: return "Strength"
case .none: return "None"
}
}
}
Эта структура создается с использованием следующего, поскольку вы можете видеть, что itemType - это тип перечисления, через который я прохожу.
FormPickerItem(id: "userGoals", title: "Goals", itemType: UserGoal.self, margin: UIEdgeInsets(top: 0, left: 30, bottom: 0, right: 30), size: nil)
EnumItem - это протокол, в котором все перечисления являются подклассами, поэтому я могу легко передать любое перечисление в качестве универсального типа в имеющемся у меня настраиваемом классе. Итак, проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу передать свойство в своей структуре в качестве универсального типа.
func configure(with formPickerItem: FormPickerItem, atIndex index: Int = 0, toolBarType: ToolBarType? = .standard, delegate: FormTextFieldDelegate?) {
self.formPickerItem = formPickerItem
self.index = index
self.toolBarType = toolBarType
self.delegate = delegate
if loftyPicker == nil {
loftyPicker = LoftyPicker<formPickerItem.itemType>(index: index, title: formPickerItem.title, applyBottomBorder: true, parentView: self.contentView, loftyDelegate: self)
contentView.addSubview(loftyPicker!)
applyConstraints()
}
}
И так объявлен класс LoftyPicker.
final class LoftyPicker<Item: EnumItem>: LoftyBaseTextField, UIPickerViewDelegate, UIPickerViewDataSource, LoftyToolBarDelegate {
....
}
Я получаю следующую ошибку: Use of undeclared type 'formPickerItem'. Возможно ли это в кратчайшие сроки? Если нет, как я могу передать тип перечисления в класс?
@meggar yes formPickerItem - это параметр функции, не относящейся к типу FormPickerItem
Вы не определили LoftyPicker в своем вопросе
Вам нужно показать код в более широком контексте; где заявлен типformPickerItem?
@ Paulw11 @ Carpsen90 Я добавил больше контекста
formPickerItem - это не тип. FormPickerItem - это тип. Я думаю, вы просите Swift использовать тип, предоставляемый formPickerItem.itemType во время выполнения, но это не сработает. Компилятор Swift должен иметь возможность определять тип во время компиляции. Вероятно, вы захотите объявить протокол, который могут быть приняты различными типами, а не использовать в этом случае универсальные шаблоны, или, возможно, фабричный шаблон с подклассами.





Это должна быть строчная F?