Не удалось привести значение типа '_SwiftValue' к 'NSNumber' - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь преобразовать ответ "status" снизу в Int.

{
    "status": "200",
    "message": "Token successfully generated.",
    "data": {
        "token": "abc"
    }
}

Когда я пытаюсь преобразовать, выдается сообщение об ошибке типа Не удалось привести значение типа '_SwiftValue' к 'NSNumber'.

Вот что я попробовал в коде.

var status:Int = 0
var dict = dictTemp as! Dictionary<String,AnyObject>

if let value = dict["status"] as? String {
    status = value.toInt()!
} else if let value = dict["status"] as? Int {
    status = value
}

//  let status = dictTemp!.value(forKey: "status") as? String ?? ""

if(status == 200)
{
    errorCode = 0
    error = false
}
else
{
    errorCode = 1
    error = true
}

Это всегда относится к другой части.

Здесь я приложил скриншот, который я могу видеть в данных JSON.

Пожалуйста, помогите мне, как я могу преобразовать статус в Int.

enter image description here

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Использовать структуры гораздо безопаснее:

let json = """
{
    "status": "200",
    "message": "Token successfully generated.",
    "data": {
        "token": "abc"
    }
}
"""

guard let jsonData = json.data(using: .utf8) else {
    fatalError("Couldn't convert the json to data")
}

struct Response: Codable {
    let status, message: String
    let data: TokenData
}

struct TokenData: Codable {
    let token: String
}

do {
    let decoded = try JSONDecoder().decode(Response.self, from: jsonData)
    if let status = Int(decoded.status) {
        print(status)
    } else {
        fatalError("The status is not an integer")
    }
} catch {
    print(error)
}
0 голосов
/ 20 октября 2018

Я думаю, что ваша проблема в том, что вы используете AnyObject вместо Any.Ваш словарь должен иметь тип [String: Any].

См. Этот ответ здесь .

AnyObject предназначен только для ссылочных типов (классов), Any - для обоихтипы значений и ссылок.

Кроме того, поскольку вы пометили свой вопрос как Swift 4, вы должны конвертировать, используя Int(), а не .toInt().

Пример:

func getStatus(jsonData: Data) -> Int {
    guard
        let json = try? JSONSerialization.jsonObject(with: jsonData, options: []),
        let dict = json as? [String: Any],
        let statusString = dict["status"] as? String,
        !statusString.isEmpty,
        let status = Int(statusString)
        else {
        return 0
    }

    return status
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...