Мне нужно показать информацию без скобок - PullRequest
0 голосов
/ 11 марта 2020

enter image description here

У меня есть код, который получает API погоды, но информация из "weather" выводит информацию "id" и "main" в консоли, а также в текстовой метке с скобками в консоли

(
    250
)

Вот соответствующий код:

 if let weather = jsonObj.value(forKey: "weather") as? NSArray {

     let idObject = weather.value(forKey: "id")
     // DispatchQueue.main.sync {
     // self.weatherLabel.text = idObject as? String }
     print (idObject)

     let mainObject = weather.value(forKey: "main")
     print(mainObject as Any)
 }

1 Ответ

0 голосов
/ 11 марта 2020

Ниже, во второй половине этого ответа, я опишу, в чем проблема в вашем фрагменте кода. Но вы используете Swift, поэтому вам вообще не следует использовать NSDictionary и NSArray. Вы должны использовать JSONDecoder для анализа json и иметь дело исключительно с объектами Swift.

Таким образом, вы можете определить такие структуры следующим образом:

struct WeatherReport: Decodable {
    let id: Int
    let main: String
}

struct ResponseObject : Decodable {
    let weather: [WeatherReport]
}

И декодировать это так:

do {
    let responseObject = try JSONDecoder().decode(ResponseObject.self, from: data)
    for weatherReport in responseObject.weather {
        print(weatherReport.id)
    }
} catch {
    print(error)
}

Теперь мое определение WeatherReport, несомненно, неверно, поскольку оно должно соответствовать вашей структуре JSON, которой вы с нами не поделились. Например, я предполагаю, что ваши значения id являются цифрами c (без кавычек; мы не можем определить это, посмотрев на ваш вывод). Также вам следует проверить документацию и выяснить, как выглядит JSON в случае ошибки. Так что вы должны это проверить. Но, надеюсь, это иллюстрирует идею.


Относительно того, почему вы видите ( и ) вокруг ваших значений, это потому, что объекты, которые вы печатаете, сами по себе являются NSArray объектами. Когда вы вызываете value(forKey:) для NSArray из NSDictionary объектов, он будет go через массив и захватывать значение, связанное с этим ключом для каждого словаря в вашем массиве, и будет возвращать массив значений. Отсюда ( и ) на выходе. Конечно, ваш «массив словарей» в настоящее время содержит только один словарь, но тот факт, что это массив, позволяет предположить, что weather может содержать несколько словарей.

Учитывайте это чрезмерное упрощенная версия вашего JSON:

{
    "weather": [
        {
            "id": 42,
            "main": "Rain"
        },
        {
            "id": 520
            "main": "Cloudy"
        }
    ]
}

Таким образом

if let weather = jsonObj.value(forKey: "weather") as? NSArray {
    let identifiers = weather.value(forKey: "id")
    print (identifiers)
}

будет выводить

(
    42,
    520
)

Теперь, ваш массив словарей, очевидно, имеет только один словарь в этот момент, но это иллюстрирует, что происходит.

Если вы не хотите скобки, получите firstObject из массива:

guard
    let weather = jsonObj.value(forKey: "weather") as? NSArray,
    let weatherReport = weather.firstObject as? NSDictionary
else {
    return
}

if let idObject = weatherReport.value(forKey: "id") as? Int {
    print(idObject)
}

Или, если вы хотите напечатать все они:

guard
    let weather = jsonObj.value(forKey: "weather") as? NSArray
else {
    return
}

for object in array {
    if let weatherReport = weather as? NSDictionary, let identifier = weatherReport["id"] as? Int {
        print(identifier)
    }
}

Вот как можно перемещаться по NSArray из NSDictionary объектов. Но, как описано в начале моего ответа, вы не должны использовать эти NS типы вообще. Получите ваш необработанный Data и декодируйте его для типов объектов модели, используя вместо этого JSONDecoder.

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