簡體   English   中英

通用化方法來編碼“可編碼”協議

[英]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.TypeType2.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM