当采用协议的类/结构没有提供实现时,这意味着什么



据我所知,协议是没有实际实现的属性、方法和其他需求的蓝图。协议的一致性意味着提供蓝图的实际实现。但是,我经常看到类和结构在没有实际提供实现的情况下采用协议。

例如:

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的属性符合Codableinit(from:)encode(to:)等方法就会自动添加到该类型中。

只要它的所有属性都是可编码的,任何自定义类型也可以是可编码类型。

编码和解码自定义类型

另一个很好的例子是Equatable,请参阅符合相等协议

自动合成是通过协议扩展完成的。

Codable协议是编译器可以合成的少数协议(EquatableHashable(之一,只要一个类型的所有属性也符合该协议。这意味着编译器正在为您注意到缺少的协议生成实现

最新更新