面向Swift协议的编程:协议扩展属性可以与基类属性具有相同的名称

时间:2017-04-01 01:52:36

标签: ios swift protocols

方案

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

问题

协议扩展中的属性名称是否必须与基类中的属性名称不同,或者是否会执行上述操作?如果我在实现我的设计之前知道这没关系,那就太好了。

2 个答案:

答案 0 :(得分:2)

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

enter image description here

答案 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
        }
    }
}