我可以使用没有函数的Swift协议

时间:2016-08-25 20:40:10

标签: swift protocols

考虑这个典型的例子,有时可以在教程中看到,等等(even in Apple's code):

protocol Nameable {
     var name: String {get}
}

struct Person : Nameable {
     var name: String
}

我的问题是,这种模式会带来什么好处?一旦将函数添加到协议中,我就能理解它,但对于只有一个或多个变量的协议,什么可能是一个很好的应用程序?为什么不向每个namestruct添加class

3 个答案:

答案 0 :(得分:6)

Person并不是您唯一不想要命名的东西。宠物有名字,道路有名字,哎呀,有人叫他们的车。

如果我们想要在不同对象的集合中命名每个对象,该怎么办?如果我们将这些对象存储在Any的集合中,我们就没有办法保证所有对象都有名称。

这是协议的用武之地。通过创建Nameable协议,我们可以创建一个Nameable个对象的集合,并确保其中的所有对象都有一个名称。

以下是一个例子:

protocol Nameable {
    var name: String {get}
}

struct Person : Nameable {
    let name: String
    let age: Int
    // other properties of a Person
}

struct Pet : Nameable {
    let name: String
    let species: String
    // other properties of a Pet
}

struct Car : Nameable {
    let name: String
    let horsepower: Double
    // other properties of a Car
}

let namableItems: [Nameable] = [
    Person(name: "Steve", age: 21),
    Pet(name: "Mittens", species: "Cat"),
    Car(name: "My Pride and Joy", horsepower: 9000)
]

for nameableItem in namableItems {
    print("\(nameableItem.name) is a \(nameableItem.dynamicType).")
}

打印哪些:

  

史蒂夫是一个人。

     

连指手套是宠物。

     

我的骄傲和喜悦是一辆车。

You can try it here.

答案 1 :(得分:1)

基本上,您承诺您的类/结构将包含已定义的属性。

对于结构,这非常重要,因为它们不能被子类化。

此外,子类只能有1个超类,因此您无法创建具有多个父类的Person。

我建议你阅读这篇文章,了解为什么使用协议而不是子类化以及使用它们的主要目的:

http://alisoftware.github.io/swift/protocol/2015/11/08/mixins-over-inheritance/

答案 2 :(得分:1)

答案的关键在于协议

  

协议是一个解释正确行为的规则系统   正式情况下应遵循的程序。

那就是说,当你陈述一个对象(struct,enum,class,..)必须符合协议时,你有义务尊重它。如果不这样做,Xcode会抛出错误

所以其中一个主要的(绝对不是唯一的实用程序)是你不能忘记在各种对象中包含属性和/或函数。

如果多个开发人员正在处理相同的代码,或者只是为了避免潜在的人为干扰错误,这可能非常有用:)。

协议的另一大优势是它们可以用作类型

因此,继承相同协议的struct,enum或不同的类,它们都可以追溯到相同的类型。