使用泛型来增强类型安全性

让我们在不使用泛型的情况下采用这个例子

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