迅速覆盖属性

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 typeprotocol 解决您遇到的问题。由于它的类型推断,通常不需要显式定义抽象类型(在这种情况下,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
    

只是为了琐事,我认为你应该使用DataTypesolution

【讨论】:

以上是关于迅速覆盖属性的主要内容,如果未能解决你的问题,请参考以下文章

更改自定义 UINavigationBar 属性不能完全迅速

菜单的属性方法

点击该单元格时,如何访问 uicollectionviewcell 内标签的文本属性? (迅速)

如果没有可选关系属性的值,核心数据不会加载?!?迅速

如何在类扩展中添加静态(存储)属性以制作单例? (迅速)

Spring 模型属性覆盖具有相同名称的会话属性