[英]Swift 4 JSONEncoder can not encode String or Int, But they followed Codable protocol
[英]Genericize method to encode a `Codable` protocol
import Foundation
protocol ProtocolA: Codable {
var var1: String { get }
}
struct Type1: ProtocolA {
var var1: String
var var2: Int
}
struct Type2: ProtocolA {
var var1: String
var var2: Bool
}
func encode<T: ProtocolA & Encodable>(object: T) throws -> Data {
return try JSONEncoder().encode(object as! T.Type)
}
將上述內容放在操場上會導致error: argument type 'T.Type' does not conform to expected type 'Encodable'
當我說T
必須符合Encodable
時,為什么會發生這種情況?
return try JSONEncoder().encode(object as! T.Type)
這意味着將object
轉換為T
的元類型。 類型的類型。 例如,1 是一個 Int。 但是“Int”本身有一個類型,即Int.Type
,它是一種元類型。 元類型不符合 Encodable。
你的意思是:
return try JSONEncoder().encode(object as! T)
但你真的只是想說:
return try JSONEncoder().encode(object)
因為object
始終屬於 T 類型。這是 function 簽名中的顯式類型。 由於該算法也不依賴於 ProtocolA,因此這一切都歸結為:
func encode<T: Encodable>(object: T) throws -> Data {
return try JSONEncoder().encode(object)
}
您的編譯器實際上是在抱怨您最后所做的類型轉換, metatype
object
為 T 的元類型,在您的示例中為Type1.Type
或Type2.Type
。
從編碼的角度來看,編譯器需要知道的是 model 確認了Encodable
,它隱含在T: Codable
語句中。
import Foundation
protocol ProtocolA: Codable {
var var1: String { get }
}
struct Type1: ProtocolA {
var var1: String
var var2: Int
}
struct Type2: ProtocolA {
var var1: String
var var2: Bool
}
func encode<T: Codable>(object: T) throws -> Data {
return try JSONEncoder().encode(object)
}
let type2 = Type2(var1: "test1", var2: true)
print(type2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.