2017-04-01 47 views
1

方案斯威夫特协议的面向对象编程:协议扩展属性可以有相同的名称作为基类属性

我对将在两个单独的项目使用的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模型接收它可以理解的对象。

问题

是否在协议扩展属性名称必须比是在基类的属性的名称不同,还是会做好以上工作的?如果我在实施我的设计之前知道这是好的,那就太好了。

回答

2

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

enter image description here

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 
     } 
    } 
} 
+0

感谢您的回答。您编写的示例代码不显示分配'count'属性的扩展名。 –

+0

@BrandonA Array有count属性。用更多细节更新我的答案。 – Lumialxk