ios - 用不同的类型覆盖 Swift var

标签 ios swift overriding

我想用不同类型覆盖一个类的属性。我已经使用以下代码将其与 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) 来覆盖类类型属性?

最佳答案

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

关于ios - 用不同的类型覆盖 Swift var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32829543/

相关文章:

c# - 覆盖对象的虚拟方法

swift - 无法将调用结果类型 "Bool"转换为预期类型 int?

java - 当派生类扩展基类并同时实现接口(interface)时,谁的方法被重写?

ios - 无法在 Release Build 中使用通过 Cocoapods 添加的框架

ios - 以编程方式将 UIView 添加到 UITableView 的底部

swift - 弱引用和无主引用有什么区别?

swift - 你如何打开 Swift 可选值?

python - 我可以更改 Python 绑定(bind)方法对象的 __str__() 属性吗?

ios - 提醒打开应用反馈

ios - 来电时暂停 iOS 音频流的最佳方法