采用协议的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)")
}
这里的Item
class采用Codable
协议,class的实例作为PropertyListEncoder()
实例方法的参数.但是,在此过程中没有提供或使用 Codable
协议的实现。
Codable
协议是少数几个可以由编译器合成的协议(Equatable
、Hashable
)之一,只要类型的所有属性也符合该协议协议。这意味着编译器正在为您注意到丢失的协议生成实现
有些协议提供所谓的自动合成。在 Codable
的情况下,这意味着只要 Item
的属性符合 Codable
,init(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完成。
据我了解,协议是属性、方法和其他要求的蓝图,没有实际实现。遵守协议意味着提供蓝图的实际实现。但是,我经常看到 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)")
}
这里的Item
class采用Codable
协议,class的实例作为PropertyListEncoder()
实例方法的参数.但是,在此过程中没有提供或使用 Codable
协议的实现。
Codable
协议是少数几个可以由编译器合成的协议(Equatable
、Hashable
)之一,只要类型的所有属性也符合该协议协议。这意味着编译器正在为您注意到丢失的协议生成实现
有些协议提供所谓的自动合成。在 Codable
的情况下,这意味着只要 Item
的属性符合 Codable
,init(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完成。