使用不同类型重写Swift var

问题描述:

我想覆盖具有不同类型的类的属性。我已经得到了这个与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)?

在您的课程示例中,SearchBarUISearchBar的子类型。但是,在您的协议示例中,Optional<SplitViewDelegate>不是Optional<UISplitViewControllerDelegate>的子类型。问题确实如此:类型Optional<Wrapped>在包装上不是协变的。斯威夫特不会也可能永远不会支持co- and contravariance.