协议让我们定义结构体、类和枚举如何工作,他们应该拥有哪些方法和属性,当我们说某个类型遵守某个协议时,swift会强制这个类型拥有这些方法和属性。
一个协议中只有一个buy()方法,但它是抽象的,非具体的,它是一类事物的通用代码。被一个看电影类遵守就说买电影票的方法,被奶茶遵守就说买奶茶方法。它不关心类型会如何具体实现,而只关心能否被遵守。
如果给买书单独一个方法会是这样的。
struct Book {
var name: String
}
func buy(_ book: Book) {
print("print("buy book")")
}
为了创建一个更灵活的基于协议的方法,我们首先要创建一个协议来声明我们需要的基本功能。它可能包含许多方法和属性,但这里我们只需要一个买方法:
protocol Purchaseable {
func purchase()
}
继而让类型遵守
struct Book: Purchaseable {
func purchase() { print("Buy book") }
}
struct Movie: Purchaseable {
func purchase() { print("Buy movie") }
}
func buy(_ item: Purchaseable) {
item.purchase()
}
协议的灵活性更高,要更灵活就要更抽象,方法剥离类型,依赖于协议,想修改方法的实现时,修改协议中的方法即可。 swift编译器会强制类型遵守协议,如果没有实现其属性或方法,就会报错。