JSONEncoder.encode在继承的情况下产生:线程1:EXC_BAD_访问
要与我的服务器通信,我正在使用JSONEncoder.encode在继承的情况下产生:线程1:EXC_BAD_访问,json,swift,xcode,encoding,Json,Swift,Xcode,Encoding,要与我的服务器通信,我正在使用网络消息的对象: class NetworkMessage: Codable { var version:Int?; required init() { } } class AddPlayerRequest: NetworkMessage { var playerName: String?; var playerHashedPw:String?; } 我现在尝试将我的对象编码为字符串,以便通过网络将其发送到
网络消息的对象
:
class NetworkMessage: Codable {
var version:Int?;
required init() {
}
}
class AddPlayerRequest: NetworkMessage {
var playerName: String?;
var playerHashedPw:String?;
}
我现在尝试将我的对象编码为字符串,以便通过网络将其发送到我的服务器:
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try! encoder.encode(netMsg)
let stringToSend = String(data: data, encoding: .utf8)
/* and send the string to the Server here... */
现在,当我尝试发送类型为NetworkMessage
的对象时,一切正常,但当我使用NetworkMessage
的子类时,在本例中是CreatePlayerRequest
,会抛出此错误:
线程1:EXC\u错误访问(代码=1,地址=0x10)
在这一行:
let data = try! encoder.encode(netMsg)
谢谢你的帮助
*******更新*******
我现在复制了您的代码,并在另一行中得到了错误信息(请参阅注释):
do {
let netMsg = AddPlayerRequest()
netMsg.playerName = "Test"
netMsg.playerHashedPw = "hynt87t7t76yt=="
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try encoder.encode(netMsg) /* Thread 1: EXC_BAD_ACCESS */
let stringToSend = String(data: data, encoding: .utf8)
print(stringToSend ?? "")
} catch {
print(error)
}
在继承的情况下,您必须实现
编码
本身。因此,您需要指定CodingKeys
并实现init(from:)
和encode(to:)
因此,您可以像这样更改您的类,它将起作用:
class NetworkMessage: Codable {
var version:Int?
}
class AddPlayerRequest: NetworkMessage {
var playerName: String?
var playerHashedPw:String?
private enum CodingKeys: String, CodingKey { case playerName; case playerHashedPw }
override func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(playerName, forKey: .playerName)
try container.encode(playerHashedPw, forKey: .playerHashedPw)
try super.encode(to: encoder)
}
}
测试代码:
let netMsg = AddPlayerRequest()
netMsg.playerName = "Test"
netMsg.playerHashedPw = "hynt87t7t76yt=="
netMsg.version = 1
let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
do {
let data = try encoder.encode(netMsg)
let stringToSend = String(data: data, encoding: .utf8)
print(stringToSend ?? "")
} catch {
print(error)
}
以下是输出:
{
"version" : 1,
"playerHashedPw" : "hynt87t7t76yt==",
"playerName" : "Test"
}
试试看代码>说:“我声明这里不会有错误。如果有,请终止我的程序。”考虑<代码> Do {让数据=尝试编码器。编码(…)} catch {…} /代码>以捕捉错误并检查它看错了。是的,我知道什么尝试!是的,我按照你在我的应用程序中的建议实现了它,我只是在这里修改了它,使它不再复杂。所以。。。错误说明了什么?:)这是此处要包含的关键信息。如何查看其他错误信息?您可以始终do{…}catch{print(error)}
获取有关出错原因的更多信息,然后生成的字符串是{},并且由于某些原因缺少属性:(@julien-100000我已经添加了测试代码并获得了输出。谢谢你的帮助!我复制了你的代码,StringtoSend列表仍然是“{}”.我不明白为什么…我现在复制了你的代码,在另一行中出现了另一个错误,我只是设置了一个变量。我真的不明白这是如何产生错误的…也许你有什么想法?谢谢你的帮助。我用“更新”标记了新的错误