iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 当func编码中的归档对象(使用aCoder:NSCoder)方法在真实的revice中使用swift enum崩溃大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的单身课程中,我有一个快速的枚举:

import UIKit

enum UserType {
    case terant  // 
    case normalUser  // 
    case normalUserFinancialer  // 
}

@objc(UserStaticSwift)
class UserStaticSwift:NSObject,NSCoding {

报告的错误

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

使用控制台日志:

在编码中:

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时调试:

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

控制台日志:

(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,请注明来意。