斯威夫特。在子类中使用扩展属性类型
问题描述:
我需要子类中的扩展属性,但此代码不能编译。斯威夫特。在子类中使用扩展属性类型
protocol A {
}
protocol B: A {
}
protocol C: A {
}
class Base {
var presenter: A?
}
class Left: Base {
override var presenter: B?
}
class Right: Base {
override var presenter: C?
}
如何在Swift 2上实现这个?
答
您无法在swift中重写或更改属性类型,但投射可能会对您有所帮助。在此代码中选择Left类,例如:
protocol A {
}
protocol B: A {
}
protocol C: A {
}
class Base {
var presenter: A?
}
class Left: Base {
init(persenter : B?) {
self.presenter = presenter
}
func test() {
print(presenter as! B)
}
}
class Right: Base {
var presenter: C? //WON'T COMPILE
}
+0
谢谢,我做了一个新的懒惰属性,并在那里演示了演示者。我想要超类不知道这个属性的子类细节。这是一个糟糕的设计或迅速的功能? – adnako
+0
在我看来,这不是一个糟糕的设计,只是你不能在声明后改变变量类型,这在类型化语言中是有意义的。仍然超级类不知道任何关于子类的细节,除了它包含一个名为presenter的属性并且它符合名为A的协议 –
这是不可能的,因为您将更改超类的合同。这看起来像一个架构问题,应该可能通过泛型,关联类型或更好的整体设计来解决。 – Sulthan
我只是不希望超类知道子类的细节。为什么这是一个架构问题?现在我把这个属性放在每个子类中。 – adnako
您尝试执行的操作有很多问题 - [读写属性不变](http://*.com/a/37810234/2976878)&[协议不符合自己]( http://*.com/questions/33112559/protocol-doesnt-conform-to-itself)。正如Sulthan所说,你将不得不重新考虑你的设计。你的实际用例是什么? – Hamish