2015-09-28 26 views
0

我想覆蓋具有不同類型的類的屬性。我已經得到了這個與UISearchController工作用下面的代碼:使用不同類型重寫Swift var

class SearchController: UISearchController { 
    lazy private var _searchBar: SearchBar = { return SearchBar() }() 
    override var searchBar: SearchBar { return _searchBar } 
} 

class SearchBar: UISearchBar {} 

與該代碼,我可以覆蓋UISearchBar財產,使我的自定義SearchBar。但是,使用類似的代碼嘗試使用協議不會編譯。

protocol SplitViewDelegate: UISplitViewControllerDelegate {} 

class SplitViewController: UISplitViewController { 
    var _delegate: SplitViewDelegate? 
    override var delegate: SplitViewDelegate? { return _delegate } 
} 

我知道我重寫的委託需要一個getter和setter,但是如果我提供一個,問題是一樣的。我把它留給我的問題來簡明扼要。

我也知道有很多解決方法,比如讓setter進行類型檢查,或者使用不同的屬性名稱。這純粹是爲了理解。

我的問題是:爲什麼我可以使用不同的類(SearchController)覆蓋類類型屬性,但不使用協議(SplitViewController)?

回答

2

在您的課程示例中,SearchBarUISearchBar的子類型。但是,在您的協議示例中,Optional<SplitViewDelegate>不是Optional<UISplitViewControllerDelegate>的子類型。問題確實如此:類型Optional<Wrapped>在包裝上不是協變的。斯威夫特不會也可能永遠不會支持co- and contravariance.

相關問題