air*_*aft 4 enums archive ios swift
在我的singleton班上,我有一个swift枚举:
import UIKit
enum UserType {
case terant //
case normalUser //
case normalUserFinancialer //
}
@objc(UserStaticSwift)
class UserStaticSwift:NSObject, NSCoding {
Run Code Online (Sandbox Code Playgroud)
报道error:
随着console日志:
libc ++ abi.dylib:以NSException类型的未捕获异常终止
在encode:
func encode(with aCoder: NSCoder) {
/* ?? */
aCoder.encode(islogin, forKey: "islogin")
aCoder.encode(type!, forKey: "type") // crash here in real device
aCoder.encode(forOcType, forKey: "forOcType")
aCoder.encode(username, forKey: "username")
aCoder.encode(password, forKey: "password")
aCoder.encode(userId, forKey: "userId")
Run Code Online (Sandbox Code Playgroud)
code我在这里存档我userStatic:
userStatic.addUserInfo(type: userStatic.type!, dic: userInfoDic, closure: { (void) in
// success then archive `userStatic`
let paths:NSArray = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) as NSArray
let path = paths.firstObject
let homePath = "\(path)/\(Global.archive_userStaticData)"
let _ = NSKeyedArchiver.archiveRootObject(userStatic, toFile: homePath)
})
Run Code Online (Sandbox Code Playgroud)
我的debug时间archiveRootObject:
该console日志:
(lldb) po NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) as NSArray
error: Couldn't materialize: couldn't get the value of void: extracting data from value failed
error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression
(lldb) po homePath
error: Couldn't materialize: couldn't get the value of void: extracting data from value failed
error: errored out in DoExecute, couldn't PrepareToExecuteJITExpression
Run Code Online (Sandbox Code Playgroud)
我已经在测试simulator和device,在simulator不存在的问题,在实际device的问题出来.
试试这个问题吧
func encode(with aCoder: NSCoder) {
aCoder.encode(type.rawValue, forKey: "type")
}
Run Code Online (Sandbox Code Playgroud)
欲获得更多信息
让我们详细讨论这个问题
例如,这是我的枚举:
enum PieceType : Int {
case empty
case notEmpty
}
Run Code Online (Sandbox Code Playgroud)
这是我的对象,它是孩子的 NSObject
class Piece: NSObject, NSCoding {
var islogin: Bool
var type: PieceType
var username: String!
var password: String!
override init() {
islogin = false
type = PieceType.empty
username = ""
password = ""
}
required init(coder aDecoder: NSCoder) {
islogin = aDecoder.decodeBool(forKey: "islogin")
type = PieceType(rawValue: aDecoder.decodeObject(forKey: "type") as! Int)!
username = aDecoder.decodeObject(forKey: "username") as! String
password = aDecoder.decodeObject(forKey: "password") as! String
}
func encode(with aCoder: NSCoder) {
aCoder.encode(islogin, forKey: "islogin")
aCoder.encode(type.rawValue, forKey: "type")
aCoder.encode(username, forKey: "username")
aCoder.encode(password, forKey: "password")
}
}
Run Code Online (Sandbox Code Playgroud)
当你调用 NSKeyedArchiver.archiveRootObject(::)它时会调用func encode(with aCoder: NSCoder)方法并转换NSObject为数据当你尝试取消归档你的对象时,它将调用init(coder aDecoder: NSCoder)方法并NSObject使用Key 转换数据.
但是Enum如果你不能enum直接编码B'Coz它是用户定义数据类型,但rawValue必须是内置数据类型,如Int,String,Float .....所以.这就是为什么当你尝试编码时enum你需要使用rawValue
我希望你能得到点.