使用泛型來增強型別安全性

讓我們在不使用泛型的情況下采用這個例子

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?`