有人可以解释如何在 Swift 中使用 NSKeyedArchiver 和 NSKeyedUnarchiver 吗?

Can someone explain how to use NSKeyedArchiver and NSKeyedUnarchiver in Swift?

提问人:davidmark 提问时间:12/1/2022 更新时间:12/1/2022 访问量:218

问:

我在 Swift 中理解 NSKeyedArchiver 和 NSKeyedUnarchiver 时遇到了麻烦。

这是我得到的一些示例代码,用于了解其使用:

class Workout : NSObject, Coding {
    var name: String!
    var entries: Int = 0

    required convenience init(coder aDecoder: NSCoder) {
        self.init()
        name = aDecoder.decodeObject(forKey: "name") as! String
        entries = aDecoder.decodeInteger(forKey: "entries")
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encode(self.name, forKey: "name")
        aCoder.encode(self.entries, forKey: "entries")
    }
}

let libDir = FileManager.default.urls(for: .libraryDirectory,
                                   in: .userDomainMask)[0]
print(libDir)

let workout = Workout()
workout.entries = 14
workout.name = "Pull-ups"

let path = libDir.appendingPathComponent("workouts")

// Serialisere til disk
if let data = try? NSKeyedArchiver.archivedData(withRootObject: workout, requiringSecureCoding: true) {
    try? data.write(to: path)
}

// Deserialisere fra disk
if let archivedData = try? Data(contentsOf: path),
        let savedWorkout = (try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(archivedData)) as? Workout {
    print("\(savedWorkout.name), entries: \(savedWorkout.entries)")
}

我以某种方式了解 NSKeyedArchiver 的工作原理,但 NSKeyedUnarchiver 中的 Workout 类是我发现难以理解的东西。课堂上发生了什么?当我尝试将类粘贴到新的 swift 文件中时,出现此错误:“在范围内找不到类型'编码'”。

swift xcode nskeyedarchiver nskeyedunarchiver

评论

2赞 Sweeper 12/1/2022
听起来你在网上的某个地方找到了这段代码,而作者打错了字? 应该是 .你到底不明白什么?CodingNSCoding
0赞 Larme 12/1/2022
看到你的结构,它可能更简单易用。另外,不要使用问号。更喜欢使用 / 并打印可能引发的错误Codabletry?docatch
0赞 Duncan C 12/1/2022
同意避免.这以静默方式失败并返回 nil,因此您不知道出了什么问题。最好使用 try/catch 并记录返回的任何错误。try?
0赞 davidmark 12/1/2022
我将代码更改为 NSCoding,现在错误已停止显示。但是我的控制台中没有打印任何内容。我还想使用 do/catch 并打印可能抛出的错误,但我不知道在代码中的什么位置添加它。我对 swift 非常陌生,所以任何建议将不胜感激。
0赞 Larme 12/1/2022
docs.swift.org/swift-book/LanguageGuide/ErrorHandling.html stackoverflow.com/questions/30720497/swift-do-try-catch-syntax

答: 暂无答案