考虑这个典型的例子,有时可以在教程中看到,等等(even in Apple's code):
protocol Nameable {
var name: String {get}
}
struct Person : Nameable {
var name: String
}
我的问题是,这种模式会带来什么好处?一旦将函数添加到协议中,我就能理解它,但对于只有一个或多个变量的协议,什么可能是一个很好的应用程序?为什么不向每个name
和struct
添加class
?
答案 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).")
}
打印哪些:
史蒂夫是一个人。
连指手套是宠物。
我的骄傲和喜悦是一辆车。
答案 1 :(得分:1)
基本上,您承诺您的类/结构将包含已定义的属性。
对于结构,这非常重要,因为它们不能被子类化。
此外,子类只能有1个超类,因此您无法创建具有多个父类的Person。
我建议你阅读这篇文章,了解为什么使用协议而不是子类化以及使用它们的主要目的:
http://alisoftware.github.io/swift/protocol/2015/11/08/mixins-over-inheritance/
答案 2 :(得分:1)
答案的关键在于协议。
协议是一个解释正确行为的规则系统 正式情况下应遵循的程序。
那就是说,当你陈述一个对象(struct,enum,class,..)必须符合协议时,你有义务强烈>尊重它。如果不这样做,Xcode会抛出错误。
所以其中一个主要的(绝对不是唯一的实用程序)是你不能忘记在各种对象中包含属性和/或函数。
如果多个开发人员正在处理相同的代码,或者只是为了避免潜在的人为干扰错误,这可能非常有用:)。
协议的另一大优势是它们可以用作类型。
因此,继承相同协议的struct,enum或不同的类,它们都可以追溯到相同的类型。