Swift: поток 1: сигнал SIGABRT (получить дочерний элемент AnyObject)

Мой код:

let userData = result["user"] as? AnyObject // { test="x"; id=0; phone="none" }

var id = Int(userData?["id"] as? String ?? String(userData?["id"] as? String ?? "0"))!

После компиляции я получаю эту ошибку:

2018-07-16 18: 21: 02.747944 + 0430 Matap [1550: 415553] - [__NSCFNumber length]: нераспознанный селектор отправлен в экземпляр 0xb000000000000003 2018-07-16 18: 21: 02.748116 + 0430 Matap [1550: 415553] * Завершается приложение из - за неперехваченное исключение 'NSInvalidArgumentException', причина: '-[__ длина NSCFNumber]: непризнанный селектор направил к экземпляру 0xb000000000000003' * стек Первый бросок вызова: (0x183c82d8c 0x182e3c5ec 0x183c90098 0x183c885c8 0x183b6e41c 0x105d9d5f4 0x105d36c68 0x106384478 0x1020a4aa0 0x10209f6cc 0x10208ac00 0x10676d1dc 0x10676d19c 0x106771d2c 0x183c2b070 0x183c28bc8 0x183b48da8 0x185b2d020 0x18db65758 0x1020c9098 0x1835d9fc0) libC++abi.dylib: завершается с необработанным исключением типа NSException

2 ответа

Решение
  • result["user"] не является AnyObjectпо выводу это явно словарь ([String:Any])
  • userData["id"] является Int

Ошибка происходит потому, что вы рассматриваете число как строку.

Однострочно выглядит круто, но иногда лучше использовать несколько строк больше для лучшей читаемости

let id : Int
if let user = result["user"] as? [String:Any], userId = user["id"] as? Int {
    id = userId
} else {
    id = 0
}

И ради крутости это один вкладыш

let id = (result["user"] as? [String:Any])?["id"] as? Int ?? 0

Идентификатор NSNumber

var id =  (userData?["id"] as! NSNumber).stringValue // seems you consider it a string  
Другие вопросы по тегам