使用泛型來增強型別安全性
讓我們在不使用泛型的情況下采用這個例子
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?`