我想用不同的类型覆盖类的属性。我已经使用以下代码使用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)?
答案 0 :(得分:2)
在您的班级示例中,SearchBar
是UISearchBar
的子类型。但是,在您的协议示例中,Optional<SplitViewDelegate>
不是Optional<UISplitViewControllerDelegate>
的子类型。问题确实是:类型Optional<Wrapped>
在Wrapped上不协变。 Swift没有也可能永远不会支持co- and contravariance.