iOS (Swift): Encoding/Decoding 枚举

iOS (Swift): Encoding/Decoding Enums

我有一些 NSObject 的子 class 定义了一个可表示 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()
    }

}

我想允许这个class被编码和解码,所以我使用如下:

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)
}

但是,我收到以下错误 Argument of '#keyPath' refers to non-'@objc' 属性 'direction' 当我更改时direction

的定义
@objc public var direction: Direction

我收到错误 属性 cannot be marked @objc because its type cannot be represented in Objective-C.

请问避免此错误的最佳方法是什么?

感谢您的帮助。

编辑

评论说明了问题。这个 link 中的答案建议如何使用 String 原始可表示来完成。

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

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)
}