gpt4 book ai didi

ios - 如何在 Swift 中归档和取消归档自定义对象?或者如何在 Swift 中将自定义对象保存到 NSUserDefaults?

转载 作者:IT王子 更新时间:2023-10-29 05:20:20 25 4
gpt4 key购买 nike

我有课

class Player {

var name = ""

func encodeWithCoder(encoder: NSCoder) {
encoder.encodeObject(name)
}

func initWithCoder(decoder: NSCoder) -> Player {
self.name = decoder.decodeObjectForKey("name") as String
return self
}

init(coder aDecoder: NSCoder!) {
self.name = aDecoder.decodeObjectForKey("name") as String
}

init(name: String) {
self.name = name
}
}

我想序列化它并保存到用户默认值。

首先,我不确定如何正确编写编码器和解码器。所以对于 init 我写了两个方法。

当我尝试执行这段代码时:

func saveUserData() {
let player1 = Player(name: "player1")
let myEncodedObject = NSKeyedArchiver.archivedDataWithRootObject(player1)
NSUserDefaults.standardUserDefaults().setObject(myEncodedObject, forKey: "player")
}

应用程序崩溃,我收到此消息:

*** NSForwarding: warning: object 0xebf0000 of class '_TtC6GameOn6Player' does not implement methodSignatureForSelector: -- trouble ahead

我做错了什么?

最佳答案

在 Swift 4 中你不再需要 NSCoding 了!有一个名为 Codable 的新协议(protocol)!

class Player: Codable {

var name = ""

init(name: String) {
self.name = name
}
}

Codable 还支持枚举和结构,因此您可以根据需要将播放器类重写为结构!

struct Player: Codable {
let name: String
}

将您的播放器保存在 Userdefaults 中:

let player = Player(name: "PlayerOne")
try? UserDefaults.standard.set(PropertyListEncoder().encode(player), forKey: "player")

注意:PropertyListEncoder()是框架Foundation中的一个类

检索:

let encoded = UserDefault.standard.object(forKey: "player") as! Data
let storedPlayer = try! PropertyListDecoder().decode(Player.self, from: encoded)

有关详细信息,请阅读 https://developer.apple.com/documentation/swift/codable

关于ios - 如何在 Swift 中归档和取消归档自定义对象?或者如何在 Swift 中将自定义对象保存到 NSUserDefaults?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24659609/

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