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时,为什么会发生这种情况?
发布于 2019-11-15 18:12:33
return try JSONEncoder().encode(object as! T.Type)这意味着将object转换为T的元类型。类型的类型。例如,1是Int。但是"Int“本身有一个类型,即Int.Type,它是一种元类型。元类型不符合可编码性。
你的意思是:
return try JSONEncoder().encode(object as! T)但你真的是说:
return try JSONEncoder().encode(object)因为object总是T类型,这是函数签名中的显式类型。由于这个算法也不依赖于ProtocolA,所以这一切归结为:
func encode<T: Encodable>(object: T) throws -> Data {
return try JSONEncoder().encode(object)
}发布于 2019-11-15 17:40:36
您的编译器实际上是在抱怨您在结束时所做的转换类型,即将object转换为T的metatype,在您的示例中,无论是Type1.Type还是Type2.Type。
从编码的角度来看,编译器需要知道的是确认到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)https://stackoverflow.com/questions/58882058
复制相似问题