JSONEncoder.encode создает: Поток 1: EXC_BAD_ACCESS в случае наследования - PullRequest
0 голосов
/ 14 мая 2018

Для связи с моим сервером я использую объекты NetworkMessages:

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_BAD_ACCESS (код = 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)
}

1 Ответ

0 голосов
/ 14 мая 2018

В случае наследования вы должны реализовать сам Coding.Поэтому вам нужно указать 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"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...