繁体   English   中英

Swift面向协议的编程:协议扩展属性可以和基类属性同名吗

[英]Swift Protocol-Oriented Programming: Can Protocol Extension Property Have Same Name As Base Class Property

脚本

我正在开发一个将在两个独立项目中使用的SDK。 两个项目都将使用CoreData,并且需要向SDK提供两个项目的受管对象模型中存在的数据。 为此,我采用了面向协议的设计来获取SDK所需的数据。


该项目将从包含其属性的NSManagedObject基类开始...

// Project
class Tag: NSManagedObject { 
var name: String!
var code: String!
var items: [Any]!
...
}

这些名称很简单。 当我们使此类符合协议时,不必更改这些内容将是很好的。


SDK声明了两个协议。 第一个协议将是SDK填充其视图所需的数据源。 项目中的某些班级将符合此要求并成为其代表...

// SDK
protocol SDKDataSource {
    func getTaggableObjects() -> [Taggable]
}

var delegate: SDKDataSource!

第二个协议将是SDK将对其项目做出的最后通atum,它将被馈送的NSManagedObject应符合...

// SDK
protocol Taggable {
    var name: String { get }
    var code: String { get }
    var items: [Any] { get }
}

在项目中,我将创建类的扩展,并同意使该类符合Taggable协议...

// Extension (in Project w/ SDK included)
extension Tag: Taggable {

    var name: String {
        get {
            self.name
        }
    }

    var code: String {
        get {
            self.code
        }
    }

    var items: [Any] {
        get {
            self.items
        }
    }
}

这样,当SDK要求其数据源获取getTaggableObjects() ,SDK将从其可以理解的Project的CoreData模型接收对象。

协议扩展中的属性名称是否必须与基类中的属性名称不同,还是可以完成上述工作? 如果在实现我的设计之前知道这没问题,那就太好了。

我可以确认不允许使用相同的名称。

在此处输入图片说明

我试过了,是的。

protocol MyArray {
    var count: Int {get}
}

extension Array: MyArray {

}

但是,对于具有相同功能或属性的不同协议,您无法实现不同的实现。

更新
如果协议和基类具有名称相同但类型不同的属性。 您可以进行不同的实现。

protocol MyArray {
    var count: Float {get}
}

extension Array: MyArray {
    var count: Float {
        get {
            return 0.0
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM