采用协议的class/struct没有提供实现是什么意思?

What does it mean when no implementation is provided by the class/struct that adopts a protocol?

据我了解,协议是属性、方法和其他要求的蓝图,没有实际实现。遵守协议意味着提供蓝图的实际实现。但是,我经常看到 classes 和结构在没有实际提供实现的情况下采用协议。

例如:

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)")
}

这里的Itemclass采用Codable协议,class的实例作为PropertyListEncoder()实例方法的参数.但是,在此过程中没有提供或使用 Codable 协议的实现。

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

有些协议提供所谓的自动合成。在 Codable 的情况下,这意味着只要 Item 的属性符合 Codableinit(from:)encode(to:) 等方法就会自动添加到其中类型。

As long as all of its properties are Codable, any custom type can also be Codable.

Encoding and Decoding Custom Types

另一个很好的例子是 Equatable,参见 Conforming to the Equatable Protocol

自动合成通过protocol extensions完成。