2016-08-12 183 views
5

我有SWIFT代碼:斯威夫特協議繼承

import Foundation 

protocol ParentProtocol { 
    //stuff 
} 

protocol ChildProtocol:ParentProtocol { 
    //additional stuff 
} 

protocol FooProtocol { 
    var variable:ParentProtocol? { get } 
} 

class Foo:FooProtocol { 
    var variable:ChildProtocol? 
} 

我有編譯器錯誤:Type 'Foo' does not conform to protocol 'FooProtocol'

我知道,根據FooProtocol,變量的類型必須爲ParentProtocol類型。在另一方面,從ParentProtocolChildProtocol繼承,所以它也是一個ParentProtocol

是否有任何解決方案中使用的協議基業呀?

+0

@ShadowOf是的,謝謝。與相關類型的解決方案按預期工作:http://stackoverflow.com/a/38008288/824285 – somedev

+0

相關:[我怎樣才能使一個函數與一個子類返回類型符合協議,其中一個超類定義爲返回類型?](http://stackoverflow.com/questions/35094967/swift-how-can-i-make-a-function-with-a-subclass-return-type-conform-to-a-protoc) – Hamish

+1

也相關(metatypes的一致性和繼承性):[協議不符合自己?](http://stackoverflow.com/questions/33112559/protocol-doesnt-conform-to-it-自己),引用MartinR:s評論,_「即使使用'protocol P:Q {}','P'也不符合'Q'「_。 – dfri

回答

2

我發現相關類型(https://stackoverflow.com/a/38008288/824285

對我來說,該解決方案將是:

protocol FooProtocol { 
    associatedtype T = ParentProtocol 
    var variable:T? { get } 
} 
+1

請注意,在符合此協議的類中,「T」實際上可以成爲任何類型,例如,不僅是「ParentProtocol」或它的子字符串「String」。 –