考虑这个典型的例子,有时可以在教程中看到等等(甚至在Apple的代码中):
protocol Nameable {
var name: String {get}
}
struct Person : Nameable {
var name: String
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这种模式的好处是什么?一旦将函数添加到协议中,我就能理解它,但对于只有一个或多个变量的协议,什么可能是一个很好的应用程序?为什么不加入name每个struct和class?
Persons并不是唯一不是你可能想要命名的东西.宠物有名字,道路有名字,哎呀,有人叫他们的车.
如果我们想要在不同对象的集合中命名每个对象,该怎么办?如果我们将这些对象存储在一个集合中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).")
}
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
史蒂夫是个人.
连指手套是宠物.
我的骄傲和喜悦是一辆车.