swift - RawRepresentable 类型的泛型似乎被误解为 self

标签 swift generics rawrepresentable

为了将 NSCoding 与 Swift 的枚举类型一起使用,我对 NSCoder 进行了扩展:

extension NSCoder {
    func encodeEnum<Enum: RawRepresentable where Enum.RawValue == String>(value: Enum, forKey key: String) {
        self.encodeObject(value.rawValue, forKey: key)
    }

    func decodeEnumForKey<Enum: RawRepresentable where Enum.RawValue == String>(key: String) -> Enum? {
        guard let returnValue = self.decodeObjectForKey(key) as? String else { return nil }
        return Enum(rawValue: returnValue)
    }
}

encodeEnum 方法适用于 String 支持的枚举,但是当我尝试像这样解码先前编码的枚举时:

enum MyEnum: String { case Something, Other }
class MyEnumClass: NSObject, NSCoding {
    let myEnum: MyEnum

    init(myEnum: MyEnum) {
        self.myEnum = myEnum
    }

    required convenience init?(coder aDecoder: NSCoder) {
        guard let tmp = aDecoder.decodeEnumForKey("myKey") as? MyEnum else { return nil }

        self.init(myEnum: tmp)
    }
}

我在 aDecoder.decodeEnumForKey("myKey") 上遇到错误:

Value of type `NSCoder` has no member `RawValue`

我很确定它与 Enum.RawValue == String 的泛型和条件有关。但我不明白,虽然它不起作用,但适用于 encodeEnum()

最佳答案

问题是在

guard let tmp = aDecoder.decodeEnumForKey("myKey") as? MyEnum else { return nil }

编译器无法推断出

的通用占位符
func decodeEnumForKey<Enum: ...>(key: String) -> Enum?

要成为 MyEnum,您必须将结果转换为 MyEnum?:

guard let tmp = aDecoder.decodeEnumForKey("myKey") as MyEnum? else { return nil }

以便从调用上下文中将返回类型推断为 MyEnum?

关于swift - RawRepresentable 类型的泛型似乎被误解为 self ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35155056/

相关文章:

ios - 重置 uicollectionview 的 indexPath

json - ContextualDeserializer,用于使用 Jackson 将 JSON 映射到不同类型的映射

c# - 如何将 IEnumerable<T> 添加到现有的 ICollection<T>

swift - 在 Swift 中存储 Enum 类型

ios - 如何在应用程序委托(delegate)之外注册本地通知?

iOS堆栈 View 约束问题

ios - 条形按钮项目未在 SWIFT 中显示

java - 反射性地检查对象是否是方法的有效泛型参数

ios - Swift 枚举继承

swift - 具有原始值的枚举