方案斯威夫特协议的面向对象编程:协议扩展属性可以有相同的名称作为基类属性
我对将在两个单独的项目使用的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将为它的项目的NSManagedObject
将美联储应符合...
// SDK
protocol Taggable {
var name: String { get }
var code: String { get }
var items: [Any] { get }
}
在项目中,我将创建一个扩展类,并同意该类符合加标签协议...
// 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将从项目的CoreData模型接收它可以理解的对象。
问题
是否在协议扩展属性名称必须比是在基类的属性的名称不同,还是会做好以上工作的?如果我在实施我的设计之前知道这是好的,那就太好了。
感谢您的回答。您编写的示例代码不显示分配'count'属性的扩展名。 –
@BrandonA Array有count属性。用更多细节更新我的答案。 – Lumialxk