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)
}
我有一些 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)
}