用不同的类型覆盖 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 示例中,SearchBar
是 UISearchBar
的子类型。但是在您的协议示例中,Optional<SplitViewDelegate>
不是 Optional<UISplitViewControllerDelegate>
的子类型。真正的问题是:类型 Optional<Wrapped>
在 Wrapped 上不是协变的。 Swift 不支持也可能永远不会支持 co- and contravariance.
我想用不同类型覆盖 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 示例中,SearchBar
是 UISearchBar
的子类型。但是在您的协议示例中,Optional<SplitViewDelegate>
不是 Optional<UISplitViewControllerDelegate>
的子类型。真正的问题是:类型 Optional<Wrapped>
在 Wrapped 上不是协变的。 Swift 不支持也可能永远不会支持 co- and contravariance.