[英]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.