据我所知,协议是没有实际实现的属性、方法和其他需求的蓝图。协议的一致性意味着提供蓝图的实际实现。但是,我经常看到类和结构在没有实际提供实现的情况下采用协议。
例如:
class Item: Codable {
var title: String = ""
var done: Bool = false
}
var itemArray = [Item]()
let encoder = PropertyListEncoder()
do {
let data = try encoder.encode(itemArray)
try data.write(to: dataFilePath!)
} catch {
print("Error encoding item array, (error)")
}
这里的Item
类采用Codable
协议,并且该类的实例被用作PropertyListEncoder()
的实例方法的参数。然而,在此过程中没有提供或使用Codable
协议的实现。
有些协议提供所谓的自动合成。在Codable
的情况下,这意味着只要Item
的属性符合Codable
,init(from:)
或encode(to:)
等方法就会自动添加到该类型中。
只要它的所有属性都是可编码的,任何自定义类型也可以是可编码类型。
编码和解码自定义类型
另一个很好的例子是Equatable
,请参阅符合相等协议
自动合成是通过协议扩展完成的。
Codable
协议是编译器可以合成的少数协议(Equatable
、Hashable
(之一,只要一个类型的所有属性也符合该协议。这意味着编译器正在为您注意到缺少的协议生成实现