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
.
如何编码和解码无值枚举?
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)
归档时间: |
|
查看次数: |
1237 次 |
最近记录: |