繁体   English   中英

iOS(Swift):编码/解码枚举

[英]iOS (Swift): Encoding/Decoding Enums

我有一些NSObject子类,在下面定义了一个可表示字符串的Enum

class SomeClass: NSObject {

    enum Direction: String {
        case north = "North"
        case south = "South"
    }

    public var direction: Direction

    init(direction: Direction) {
        self.direction = direction
        super.init()
    }

}

我想允许对此类进行编码和解码,因此我使用以下方法:

func encode(with aCoder: NSCoder) {
    aCoder.encode(direction, forKey: #keyPath(direction))
}

public convenience required init?(coder aDecoder: NSCoder) {
    self.init(direction: aDecoder.decodeObject(forKey: #keyPath(direction)) as! Direction)
}

但是,出现以下错误“ #keyPath”的参数是指非“ @objc”属性的“ direction”,并且当我将direction的定义更改为

@objc public var direction: Direction

我收到以下错误消息: Property不能标记为@objc,因为它的类型不能在Objective-C中表示

请避免这种错误的最佳方法是什么?

谢谢你的帮助。

编辑

注释说明了问题。 此链接中的此答案建议如何完成使用String Raw可表示的对象。

如何在Objective-C中使Swift String枚举可用?

您可以利用基于String的枚举(不仅是)具有的rawValue支持:

func encode(with aCoder: NSCoder) {
    aCoder.encode(direction.rawValue, forKey: "direction")
}

public convenience required init?(coder aDecoder: NSCoder) {
    guard let direction = Direction(rawValue: aDecoder.decodeObject(forKey: "direction") else {
        // direction was not encoded, we assume an encoding error
        return nil
    }
    self.init(direction: direction)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM