Generics 具有多类型约束的复杂扩展

Generics 具有多类型约束的复杂扩展,generics,type-conversion,protocols,swift5,decoding,Generics,Type Conversion,Protocols,Swift5,Decoding,我试图用嵌套约束扩展一个类型,但对于如何实现以下内容,我有点不知所措: extension-KeyedDecodingContainer,其中K:CodingKey, K:有代表性, RawValue:AnyHashable{ ///辅助方法 func解码(进入对象:inout[K.RawValue:Any],uType:T.type, forKey:key:KeyedDecodingContainer.key)抛出T:Decodable{ object[key.rawValue]=尝试self

我试图用嵌套约束扩展一个类型,但对于如何实现以下内容,我有点不知所措:

extension-KeyedDecodingContainer,其中K:CodingKey,
K:有代表性,
RawValue:AnyHashable{
///辅助方法
func解码(进入对象:inout[K.RawValue:Any],uType:T.type,
forKey:key:KeyedDecodingContainer.key)抛出T:Decodable{
object[key.rawValue]=尝试self.decode(type,forKey:key)作为任意
}
}
示例用法如下:


结构值:可解码{
枚举编码键:字符串,编码键{
病例id
}
init(来自解码器:解码器)抛出{
让c=try decoder.container(keyedBy:CodingKeys.self)
变量对象=[字符串:任意]()
尝试c.decode(转换为:&object、Int.self、forKey:.id)
}
}

有可能吗?提前谢谢

是的,你就快到了

  • KeyedDecodingContainer
    没有
    RawValue
    类型,只有
    K
    有,因为
    K
    符合
    RawRepresentable
  • AnyHashable
    Hashable
    的具体实现。要约束泛型参数时,请使用
    Hashable
  • KeyedDecodingContainer.Key
    可以简化为仅
    Key
    ,因为您在
    KeyedDecodingContainer
    的范围内
  • 您不需要像任何人一样使用
    。所有内容都可以隐式转换为
    任意
extension-KeyedDecodingContainer,其中K:CodingKey,
K:有代表性,
K.RawValue:可散列{
///辅助方法
func解码(进入对象:inout[K.RawValue:Any],uType:T.type,
forKey:key)在T:Decodable的位置抛出{
object[key.rawValue]=尝试self.decode(类型,forKey:key)
}
}

K.
access!!
T.Type
和我对
K.RawValue
的使用应该是一个提示,我想
RawValue
应该被“扩展”,就像通用
K
在约束中一样。谢谢你的回复,就这样。是的,它不会让我在发布问题后马上接受答案。
extension KeyedDecodingContainer where K : CodingKey,
                                       K : RawRepresentable,
                                       K.RawValue : Hashable {

    /// A helper method
    func decode<T>(into object: inout [K.RawValue : Any], _ type: T.Type,
                 forKey key: Key) throws where T : Decodable {
        object[key.rawValue] = try self.decode(type, forKey: key)
    }
}