迅速覆盖属性
Posted
技术标签:
【中文标题】迅速覆盖属性【英文标题】:Property overriding in swift 【发布时间】:2015-11-24 10:10:51 【问题描述】:我有一个 DataSource
协议,其中包含 data
类型的 Any
属性:
protocol DataSource
var data: Any? get
然后我想用一个将数据类型限制为某种类型的类来实现这个协议:
class IntDataSource: DataSource
var data: Int?
但编译器声称它不符合协议,但Int
符合Any
类型。
为什么我不能覆盖 swift 属性的类型?
【问题讨论】:
我不知道它是否有帮助,但 Mike Ash 写了一篇关于该主题的精彩文章:mikeash.com/pyblog/… 可以指定: get
【参考方案1】:
应该几乎总是避免使用像Any
这样的通配符类型,而应该使用通用解决方案,利用 swift 的类型系统。
protocol DataSource
typealias DataType
var data: DataType? get
class IntDataSource: DataSource
var data: Int?
Swift 允许 associated type 为 protocol
解决您遇到的问题。由于它的类型推断,通常不需要显式定义抽象类型(在这种情况下,DataType
的具体类型是从var data: Int?
推断出来的)。
【讨论】:
【参考方案2】:DataType
答案的一个可能变化可能是使用通用函数来解决它。
protocol DataSource
func getData<T> () -> [T]
class IntDataSource<Int>: DataSource
func getData<Int>() -> [Int]
let data:[Int] = [1, 1, 2, 3]
return data
只是为了琐事,我认为你应该使用DataType
solution
【讨论】:
以上是关于迅速覆盖属性的主要内容,如果未能解决你的问题,请参考以下文章
更改自定义 UINavigationBar 属性不能完全迅速