用不同类型覆盖Swift var

时间:2015-09-28 18:31:03

标签: ios swift override

我想用不同的类型覆盖类的属性。我已经使用以下代码使用UISearchController

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)?

1 个答案:

答案 0 :(得分:2)

在您的班级示例中,SearchBarUISearchBar的子类型。但是,在您的协议示例中,Optional<SplitViewDelegate>不是Optional<UISplitViewControllerDelegate>的子类型。问题确实是:类型Optional<Wrapped>在Wrapped上不协变。 Swift没有也可能永远不会支持co- and contravariance.