С помощью быстрых протоколов, расширений и ограничений я хочу сделать две вещи:
- Создание базового абстрактного класса
Свойство подкласса и переопределения.
class PropertyBase { }
class PropA : PropertyBase {}
class PropB : PropertyBase {}
class ControllerBase {
var prop: PropertyBase?
}
class ControllerA : ControllerBase{
override var prop: PropA?
}
class ControllerB : ControllerBase{
override var prop: PropB?
}
Ошибка:
Невозможно переопределить изменяемое свойство 'prop' типа 'PropertyBase?' с ковариантным типом 'PropA?
Было бы здорово узнать, как мне добиться этого с помощью другого подхода?
EDIT
Я хотел бы добавить к этому вопросу с большей ясностью то, чего я хочу достичь.
В этом примере я создаю протокол, который имеет дело с неизвестным типом объекта. Все, что я знаю, это то, что тип может быть String
или Int
или совершенно другим классом Resource
. Я хочу поддержать эти классы разных типов, добавив расширения. По крайней мере, это то, что я думал, что правильный подход будет, но
public protocol InstrumentProtocol : class {
associatedtype Item: AnyObject
var item: Item? { get set }
var identifier: String? { get }
}
public class AbstractBase : InstrumentProtocol {
public var item: AnyObject?
public var identifier: String?
public init(_ i : AnyObject) {
item = i
}
public func about() {
print(self.item) // Any Object
}
}
//// This is what I want to achieve, but it doesn't work
public extension InstrumentProtocol where Self.Item : Instrument {
public func about() {
print(self.item) //Should be of Instrument type
}
}
public extension InstrumentProtocol where Self.Item : String {
public func about() {
print(self.item) //Should be of String type
}
}
Тип свойства item
мне неизвестен. В этом случае, был бы наилучшим подходом?