使用泛型来增强类型安全性
让我们在不使用泛型的情况下采用这个例子
protocol JSONDecodable {
static func from(_ json: [String: Any]) -> Any?
}
除非你实际使用它,否则协议声明似乎很好。
let myTestObject = TestObject.from(myJson) as? TestObject
你为什么要把结果投到 TestObject
?由于协议声明中的 Any
返回类型。
通过使用泛型,你可以避免可能导致运行时错误的问题(我们不想拥有它们!)
protocol JSONDecodable {
associatedtype Element
static func from(_ json: [String: Any]) -> Element?
}
struct TestObject: JSONDecodable {
static func from(_ json: [String: Any]) -> TestObject? {
}
}
let testObject = TestObject.from(myJson) // testObject is now automatically `TestObject?`