我想用不同类型覆盖一个类的属性。我已经使用以下代码将其与 UISearchController
一起使用:
class SearchController: UISearchController {
lazy private var _searchBar: SearchBar = { return SearchBar() }()
override var searchBar: SearchBar { return _searchBar }
}
class SearchBar: UISearchBar {}
使用该代码,我可以覆盖 UISearchBar
属性并使其成为我的自定义 SearchBar
。但是,使用类似的代码尝试通过协议(protocol)进行此操作将无法编译。
protocol SplitViewDelegate: UISplitViewControllerDelegate {}
class SplitViewController: UISplitViewController {
var _delegate: SplitViewDelegate?
override var delegate: SplitViewDelegate? { return _delegate }
}
我知道我覆盖的委托(delegate)需要一个 getter 和一个 setter,但如果我提供一个,问题是一样的。我的问题简明扼要。
我也知道有很多解决方法,比如让 setter 进行类型检查,或者使用不同的属性名称。这纯粹是为了理解。
我的问题是:为什么我可以使用不同的类 (SearchController) 而不是协议(protocol) (SplitViewController) 来覆盖类类型属性?
最佳答案
在您的类示例中,SearchBar
是 UISearchBar
的子类型.但是在您的协议(protocol)示例中,Optional<SplitViewDelegate>
不是 Optional<UISplitViewControllerDelegate>
的子类型.问题确实是:类型 Optional<Wrapped>
在 Wrapped 上不是协变的。 Swift 不支持也可能永远不会支持 co- and contravariance.
关于ios - 用不同的类型覆盖 Swift var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32829543/