Каков наилучший способ зеркального отображения объектов @property (nonatomic) NSArray <SomeProtocol>* items;
Obj-C, где находятся подклассы UIView
?Swift массив подклассов UIView, соответствующих протоколу
В приведенном ниже примере, я хотел бы хранить массив UIKit
компонентов (например, UILabel
, UIButton
и т.д.), что все соответствует протоколу, однако это дает ошибку Protocol can only be used as a generic constraint because it has Self or associated type requirements
Какие альтернативные способы моделирования этого?
Пример площадка:
import UIKit
/// Protocol representing a form field model
protocol FieldRepresentable {}
/// Protocol representing a form UI control
protocol FormControllable {
associatedtype FieldRepresentable
init(model: FieldRepresentable)
var model: FieldRepresentable { get }
}
/// Example label model
class FormLabelElement: FieldRepresentable {}
/// Example label UI control
class FormLabel: UILabel, FormControllable {
required init(model: FormLabelElement) {
self.model = model
super.init(frame: CGRect.zero)
}
let model: FormLabelElement
required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
}
/// Example form
class Form: UIView {
// Error here
var fields: [FormControllable]?
}
Возможно, эта статья может помочь: https://milen.me/writings/swift-generic-protocols/ – nebs
Вам необходимо объявить свой протокол как ': class', чтобы указать, что он будет применяться только к классу объекты, а не структуры – Paulw11