ios – 当func编码中的归档对象(使用aCoder:NSCoder)方法在真实的revice中使用swift enum崩溃

ios – 当func编码中的归档对象(使用aCoder:NSCoder)方法在真实的revice中使用swift enum崩溃,第1张

概述在我的单身课程中,我有一个快速的枚举: import UIKitenum UserType { case terant // case normalUser // case normalUserFinancialer // }@objc(UserStaticSwift)class UserStaticSwift:NSObject, NSCoding { 在我的单身课程中,我有一个快速的枚举:

import UIKitenum UserType {    case terant  //     case normalUser  //     case normalUserFinancialer  // }@objc(UserStaticSwift)class UserStaticSwift:NSObject,NSCoding {

报告的错误:

使用控制台日志:

libc++abi.dylib: terminating with uncaught exception of type NSException

编码中:

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 NSArrayerror: Couldn't materialize: Couldn't get the value of voID: extracting data from value Failederror: errored out in DoExecute,Couldn't PreparetoExecuteJITExpression(lldb) po homePatherror: Couldn't materialize: Couldn't get the value of voID: extracting data from value Failederror: 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崩溃所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1077883.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存