gpt4 book ai didi

ios - 使类符合 NSCoding

转载 作者:行者123 更新时间:2023-11-28 08:20:30 26 4
gpt4 key购买 nike

我使我的以下 Person 类符合 NSCoding 协议(protocol)。

class Person: NSObject, NSCoding{

var age:Int
var height: Double
var name: String

init(age:Int, height: Double, name:String){
self.age = age
self.height = height
self.name = name
}

func encode(with aCoder: NSCoder){
aCoder.encode(age, forKey: "age")
aCoder.encode(height, forKey: "height")
aCoder.encode(name, forKey: "name")
}

required init?(coder aDecoder: NSCoder){
age = aDecoder.decodeObject(forKey: "age") as! Int **//error**
height = aDecoder.decodeObject(forKey: "height") as! Double
name = aDecoder.decodeObject(forKey: "name") as! String
super.init()
}


}

然后,我创建了一个这个类的数组。我使用 NSKeyedArchiver 将它存档到一个 plist 中,一切都很好。但是,当我尝试取消存档时,我遇到了一个错误,涉及解包一个可选的 nil。错误出现在标记的 Person 类中。这是我使用的代码:

 if let people = unarchive(){
print(people)
}

解压函数如下:

func unarchive()->[Person]?{
let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
let documentDirectory = paths[0]
let path = documentDirectory.appending("ObjectData.plist")
let fileManager = FileManager.default
if(!fileManager.fileExists(atPath: path)){
if let bundlePath = Bundle.main.path(forResource: "ObjectData", ofType: "plist"){
do{
try fileManager.copyItem(atPath: bundlePath, toPath: path)
}catch{
print("problem copying")
}
}
}
if let objects = NSKeyedUnarchiver.unarchiveObject(withFile: path){
if let people = objects as? [Person]{
return people
}else{
return nil
}
}else{
return nil
}
}

最佳答案

IntDouble未归档为对象。 aDecoder.decodeObject(forKey: <key>)因为他们将永远返回nil ,并使用 as!nil会使您的应用崩溃。

所以,改用这个:

aDecoder.decodeInteger(forKey: "age")
aDecoder.decodeDouble(forKey: "height")

对于 name您可以保留代码的字段。

关于ios - 使类符合 NSCoding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41458816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com