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:)
方法中切换符合该协议的所有类型