【问题标题】:Overriding Swift var with a Different Type用不同的类型覆盖 Swift var
【发布时间】:2015-12-26 01:57:57
【问题描述】:

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

【问题讨论】:

    标签: ios swift overriding


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-04-03
      • 2014-10-19
      • 2018-08-31
      • 2019-09-29
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 2019-06-12
      相关资源
      最近更新 更多