Swift 对“可编码”协议进行编码的泛化方法 导入基础 协议协议:可编码{ var var1:字符串{get} } 结构类型1:ProtocolA{ var var1:String var var2:Int } 结构类型2:ProtocolA{ var var1:String var var2:Bool } func编码(对象:T)抛出->数据{ 返回try JSONEncoder().encode(对象为!T.Type) }

Swift 对“可编码”协议进行编码的泛化方法 导入基础 协议协议:可编码{ var var1:字符串{get} } 结构类型1:ProtocolA{ var var1:String var var2:Int } 结构类型2:ProtocolA{ var var1:String var var2:Bool } func编码(对象:T)抛出->数据{ 返回try JSONEncoder().encode(对象为!T.Type) },swift,generics,Swift,Generics,将上述内容放在游乐场中会导致错误:参数类型“T.type”与预期的类型“Encodable”不一致。 当我说T必须符合Encodable时,为什么会发生这种情况?您的编译器实际上在抱怨您在最后所做的类型转换,即将对象转换为T的元类型,在您的示例中是Type1.type或Type2.type 从编码的角度来看,编译器需要知道的是模型确认为Encodable,这在T:Codable语句中是隐式的 导入基础 协议协议:可编码{ var var1:字符串{get} } 结构类型1:ProtocolA{

将上述内容放在游乐场中会导致
错误:参数类型“T.type”与预期的类型“Encodable”不一致。


当我说
T
必须符合
Encodable
时,为什么会发生这种情况?

您的编译器实际上在抱怨您在最后所做的类型转换,即将
对象
转换为T的
元类型
,在您的示例中是
Type1.type
Type2.type

从编码的角度来看,编译器需要知道的是模型确认为
Encodable
,这在
T:Codable
语句中是隐式的

<代码>导入基础 协议协议:可编码{ var var1:字符串{get} } 结构类型1:ProtocolA{ var var1:String var var2:Int } 结构类型2:ProtocolA{ var var1:String var var2:Bool } func编码(对象:T)抛出->数据{ 返回try JSONEncoder().encode(对象) } 设type2=type2(var1:test1,var2:true) 打印(打字2)
您的编译器实际上是在抱怨您在最后执行的类型转换,该转换将
对象
转换为T的
元类型
,在您的示例中是
Type1.type
Type2.type

从编码的角度来看,编译器需要知道的是模型确认为
Encodable
,这在
T:Codable
语句中是隐式的

<代码>导入基础 协议协议:可编码{ var var1:字符串{get} } 结构类型1:ProtocolA{ var var1:String var var2:Int } 结构类型2:ProtocolA{ var var1:String var var2:Bool } func编码(对象:T)抛出->数据{ 返回try JSONEncoder().encode(对象) } 设type2=type2(var1:test1,var2:true) 打印(打字2) 这意味着将
对象
转换为
T
的元类型。类型的类型。例如,1是一个Int。但是“Int”本身有一个类型,它是
Int.type
,它是一个元类型。元类型不符合可编码的

你的意思是:

return try JSONEncoder().encode(object as! T.Type)
但你的意思是:

return try JSONEncoder().encode(object as! T)
因为
对象
总是类型为T。这是函数签名的显式类型。由于此算法也不依赖于ProtocolA,这一切归结为:

return try JSONEncoder().encode(object)
func编码(对象:T)抛出->数据{
返回try JSONEncoder().encode(对象)
}
这意味着将
对象
转换为
T
的元类型。类型的类型。例如,1是一个Int。但是“Int”本身有一个类型,它是
Int.type
,它是一个元类型。元类型不符合可编码的

你的意思是:

return try JSONEncoder().encode(object as! T.Type)
但你的意思是:

return try JSONEncoder().encode(object as! T)
因为
对象
总是类型为T。这是函数签名的显式类型。由于此算法也不依赖于ProtocolA,这一切归结为:

return try JSONEncoder().encode(object)
func编码(对象:T)抛出->数据{
返回try JSONEncoder().encode(对象)
}

您不必进行类型转换,因为t符合Encodable,
返回try jsonecoder()。encode(object)
将起作用。请注意,编译器没有抱怨t,但t.typet您不必进行类型转换,因为t符合Encodable,
返回try jsonecoder()。encode(object)
将起作用。请注意,编译器并没有抱怨t,而是抱怨t.TypeOk。谢谢,这是有道理的。我真正想要实现的是:
struct-Container:Codable{var-array:[ProtocolA]}
,而不必在
encode(to-encoder:)
init(from-decoder:)
methodsOk中切换符合该协议的所有类型,这很有意义。我真正想要实现的是:
struct-Container:Codable{var-array:[ProtocolA]}
而不必在
encode(to-encoder:)
init(from-decoder:)
方法中切换符合该协议的所有类型