我可以使用没有功能的Swift协议吗?

koe*_*oen 2 protocols swift

考虑这个典型的例子,有时可以在教程中看到等等(甚至在Apple的代码中):

protocol Nameable {
     var name: String {get}
}

struct Person : Nameable {
     var name: String
}
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ica 6

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)

哪个印刷品:

史蒂夫是个人.

连指手套是宠物.

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

你可以在这里试试.

  • @brandonscript有时,多个类型有一些共享功能是有意义的,但不能在类 - 子类关系中如此紧密地绑定.例如,许多类型是`CustomStringConvertible`(具有`description`属性),但是对于所有类型来说,将单个类子类化是没有意义的.使用协议还意味着您可以在完全不同类型的事物之间共享功能(其中许多事物没有子类化的概念)-structs,enums和classes都可以符合相同的协议. (2认同)
  • 这更强大.继承更具限制性.如果我希望我的`Car`在不使用协议的情况下是`Nameable`,它必须是一个名为`AbstractNameable`的抽象类的子类.但是现在我的`Car`不再是`Vehicle`的子类,因为Swift(像大多数语言一样)不支持多重继承. (2认同)