Я хочу написать протокол со слабым требованием к свойствам. Соответствующий класс должен иметь возможность указать любой тип этого свойства. Также я не хочу указывать фактический тип, поэтому он должен быть типом, указанным с некоторым протоколом. Этот код показывает мою идею для слабого свойства:Незначительные требования к свойствам в протоколе Swift со связанным типом
protocol ObjectProtocol: class {
typealias PropertyType
var property: PropertyType {get set}
}
protocol FirstPropertyProtocol: class {}
protocol SecondPropertyProtocol: class {}
class FirstObjectImpl: ObjectProtocol {
var property: FirstPropertyProtocol?
}
class SecondObjectImpl: ObjectProtocol {
var property: SecondPropertyProtocol?
}
Работает так, как ожидалось.
Я попытался сделать то же самое для слабой собственности:
protocol ObjectProtocol: class {
typealias WeakPropertyType: AnyObject //must be a class type
weak var weakProperty: WeakPropertyType? {get set}
}
protocol WeakPropertyProtocol: class {}
class ObjectImpl: ObjectProtocol {
weak var weakProperty: WeakPropertyProtocol?
}
И я получил ошибку компилятора:
Type 'ObjectImpl' does not conform to protocol 'ObjectProtocol'
Есть ли способ, что я могу сделать эту работу?
Проблема заключается в том, что протокол не соответствует самому по себе, а не к любому протоколу, что он наследует от, см http://stackoverflow.com/questions/33112559/protocol -doesnt-соответствовать самому себе для аналогичной проблемы. В вашем случае тип WeakPropertyProtocol does * not * соответствует AnyObject. –
Спасибо, комментарий, Мартин. Есть ли другой способ указать, что мой 'WeakPropertyType' является типом класса без этого ограничения AnyObject? –
Протоколы в настоящее время не могут требовать, чтобы свойства были реализованы как слабые хранимые свойства. https://stackoverflow.com/questions/47699813/weak-property-in-a-swift-protocol – Adobels