如何编码(使用NSCoding)没有rawValue的枚举?

Rob*_*ert 1 enums encoding nscoding swift swift3

我试图使我的类符合NSCoding,但遇到问题,因为它的一个属性是枚举,如下所示:

enum Direction {
    case north
    case south
}
Run Code Online (Sandbox Code Playgroud)

如果枚举是可编码的,我可以这样做:

class MyClass: NSObject, NSCoding {
    var direction: Direction!
    required init(coder aDecoder: NSCoder) {
        direction = aDecoder.decodeObject(forKey: "direction") as! Direction
    }
    func encode(with aCoder: NSCoder) {
        aCoder.encode(direction, forKey: "direction")
    }
}
Run Code Online (Sandbox Code Playgroud)

但是枚举不可编码因此encode()会引发错误.

" 如何在swift中使用NSCoder编码枚举? " 的答案建议编码枚举rawValue,然后从rawValue另一端初始化它.但在这种情况下,Direction没有了rawValue!

它确实有一个hashValue,看起来很有希望.我可以hashValue毫无问题地编码它,并Int在另一端解码回来.但似乎没有办法从它初始化枚举hashValue,所以我不能把它变成一个Direction.

如何编码和解码无值枚举?

mat*_*att 5

Swift 4中的新功能,枚举可编码的.但是,它必须具有原始值.但是,您可以轻松地执行任何其他代码:

enum Direction : String, Codable {
    case north
    case south
}
Run Code Online (Sandbox Code Playgroud)

为了与NSCoding MyClass类的可编码枚举的工作,实现你init(coder:)encode(with:)这样的:

class MyClass: NSObject, NSCoding {
    var direction: Direction!
    required init(coder aDecoder: NSCoder) {
        direction = (aDecoder as! NSKeyedUnarchiver).decodeDecodable(Direction.self, forKey: "direction")
    }
    func encode(with aCoder: NSCoder) {
        try? (aCoder as! NSKeyedArchiver).encodeEncodable(direction, forKey: "direction")
    }
}
Run Code Online (Sandbox Code Playgroud)