2016-09-07 60 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的協議 –