用不同的类型覆盖 Swift var

Overriding Swift var with a Different Type

我想用不同类型覆盖 class 的 属性。我已经使用以下代码将其与 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 进行类型检查,或者使用不同的 属性 名称。这纯粹是为了理解。

我的问题是:为什么我可以用不同的 class(SearchController)而不是协议(SplitViewController)覆盖 class 类型 属性?

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