大佬教程收集整理的这篇文章主要介绍了ios – 当func编码中的归档对象(使用aCoder:NSCoder)方法在真实的revice中使用swift enum崩溃,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
import UIKit enum UserType { case terant // case normalUser // case normalUserFinancialer // } @objc(UserStaticSwift) class UserStaticSwift:NSObject,NSCoding {
报告的错误:
使用控制台日志:
在编码中:
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")
这里的代码我归档了我的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) })
我在archiveRootObject时调试:
控制台日志:
(lldb) po NSSearchPathForDirectoriesInDomains(.documentDirectory,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
我已经在模拟器和设备中进行了测试,在模拟器中问题不存在,在实际设备中问题就出来了.
func encode(with aCoder: NSCoder) { aCoder.encode(type.rawValue,forKey: "type") }
欲获得更多信息
让我们详细讨论这个问题
例如,这是我的枚举:
enum PieCEType : Int { case empty case notEmpty }
这是我的对象,它是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") } }
当您调用NSKeyedArchiver.archiveRootObject(::)时,它将调用func编码(使用aCoder:NSCoder)方法并将您的NSObject转换为数据当您尝试取消归档对象时,它将调用init(coder aDecoder:NSCoder)方法并转换数据使用Key到NSObject.
但是在Enum的情况下你不能直接编码枚举B’Coz它是用户定义数据类型但是rawValue必须是内置数据类型,如Int,String,Float …..所以.
这就是为什么当你尝试编码枚举时,你需要使用rawValue
我希望你能得到点.
以上是大佬教程为你收集整理的ios – 当func编码中的归档对象(使用aCoder:NSCoder)方法在真实的revice中使用swift enum崩溃全部内容,希望文章能够帮你解决ios – 当func编码中的归档对象(使用aCoder:NSCoder)方法在真实的revice中使用swift enum崩溃所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。