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列表仍然是“{}”.我不明白为什么…我现在复制了你的代码,在另一行中出现了另一个错误,我只是设置了一个变量。我真的不明白这是如何产生错误的…也许你有什么想法?谢谢你的帮助。我用“更新”标记了新的错误