2016-09-07 103 views
0

我需要子类中的扩展属性,但此代码不能编译。斯威夫特。在子类中使用扩展属性类型

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上实现这个?

+1

这是不可能的,因为您将更改超类的合同。这看起来像一个架构问题,应该可能通过泛型,关联类型或更好的整体设计来解决。 – Sulthan

+0

我只是不希望超类知道子类的细节。为什么这是一个架构问题?现在我把这个属性放在每个子类中。 – adnako

+0

您尝试执行的操作有很多问题 - [读写属性不变](http://stackoverflow.com/a/37810234/2976878)&[协议不符合自己]( http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-itself)。正如Sulthan所说,你将不得不重新考虑你的设计。你的实际用例是什么? – Hamish

回答

0

您无法在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的协议 –