方案
我正在开发一个将在两个独立项目中使用的SDK。这两个项目都将使用CoreData,并且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 }
}
在项目中,我将创建一个类的扩展,并同意将该类符合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将从项目的CoreData模型中接收它可以理解的对象。
问题
协议扩展中的属性名称是否必须与基类中的属性名称不同,或者是否会执行上述操作?如果我在实现我的设计之前知道这没关系,那就太好了。
答案 0 :(得分:2)
答案 1 :(得分:0)
我试过,但是是的。
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
}
}
}