您好,匿名用户

Swift规解档对象数组不成功

0 投票

规解档没学好,所以专门写个简单demo做测试,但是一直有无法解档出数据,肯定是哪里处理不当,望各位不吝赐教。

如下我有一个dogHouse模型类,想要做规解档操作,

//类里面有一个dogs的对象数组
class dogHouse: NSObject , NSCoding{
    var dogs:[dog]?

   required init(coder aDecoder: NSCoder)
    {
        dogs = aDecoder.decodeObject(forKey: "dogs") as? [dog]
        super.init()
    }
    
    func encode(with aCoder: NSCoder) {
        if dogs != nil{
            aCoder.encode(dogs, forKey: "dogs")
        }
    }

   class dog: NSObject , NSCoding {
       //名字属性
        var name : String?
        
        required init(coder aDecoder: NSCoder) {
            name = aDecoder.decodeObject(forKey: "name") as! String?
            super.init()
        }
        
        func encode(with aCoder: NSCoder) {
            if name != nil{
                aCoder.encode(name, forKey: "name")
            } 
        }
    }

//下面是规解档的操作
//MARK: - 规解
func saveModel() -> Bool{
        return NSKeyedArchiver.archiveRootObject(self, toFile: ICModelPath)
    }

//总是会报错不知道是为什么?
//reason: '*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (_TtCC11ArchiveTest8dogHouse3dog) for key (NS.objects); the class may be defined in source code or a library that is not linked'
//MARK: - 解档
class func loadArchiver() -> [dog]?{
       let obj = NSKeyedUnarchiver.unarchiveObject(withFile: ICModelPath) as? dogHouse
        if obj != nil{
            return obj?.dogs
        }
        return nil
}

简书看到这么一篇文章

在使用对对象数组归档解档 要特别小心 iOS 下对于自定义的对象
要实现归档操作必须注意

只有使用nsdata作为中间者转换具体思路

归档 customclass ->实现nscoding->NSKeyedArchiver.archivedDataWithRootObject一个实例到nsdata->归档这个nsdata
解档  过程相反NSKeyedUnarchiver.unarchive as nsdata->cutsom=NSKeyedUnarchiver.narchiveObjectWithData->终于拿到

所以代码改成这样

//MARK: - 规档
    func saveModel() -> Bool{
        let data = NSKeyedArchiver.archivedData(withRootObject: self)
        return NSKeyedArchiver.archiveRootObject(data, toFile: ICModelPath)
    }

//MARK: - 解档
class func loadArchiver() -> [dog]?{
        let arch = NSData.init(contentsOf: URL(fileURLWithPath: ICModelPath))
        print(arch)
        if let data = arch {
            let unarchiver = NSKeyedUnarchiver(forReadingWith: data as Data)
            if let temp = unarchiver.decodeObject() as? dogHouse{
                print(temp)
               return temp.dogs
            }
        }
        //一直解档不出来数据,断点一直断在这里了
        return nil
    }

谢谢回答。

用户头像 提问 2017年 3月13日 @ Ryze 中士 (1,303 威望)
分享到:

你的回答

隐私保护: 您的邮箱仅用于发送系统通知。
请输入验证码:
    图片验证码看不清?
登录注册后不会被要求输入验证码。

提一个问题:

相关问题

0 投票
0 回复 110 阅读
用户头像 提问 2017年 3月8日 @ Sagittarius 中士 (1,214 威望)
0 投票
1 回复 132 阅读
用户头像 提问 2017年 3月15日 @ Hera 下士 (839 威望)
0 投票
1 回复 228 阅读
0 投票
1 回复 67 阅读
用户头像 提问 2016年 2月12日 @ Leona 中士 (1,399 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

IT技术交流群 - 随意问
欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...