Как получить значение NSSingleObjectArrayI - PullRequest
0 голосов
/ 27 апреля 2020
func responseDataHandler(data: NSDictionary) {
        let temperature_c = data.value(forKeyPath: "data.current_condition.temp_C")
        DispatchQueue.main.async{
            self.Temperature.text = temperature_c as? String
        }

    }

У меня есть код выше, где я получаю доступ к API погоды, который возвращает данные в форме NSDictionary для этой функции. Мне нужно получить доступ к значению Temperature_ c, которое, когда я пытаюсь его напечатать, говорит, что оно: Необязательно (<__ NSSingleObjectArrayI 0x600002147fd0> (25)). Температура - это выход метки на моей раскадровке, который я хочу принять за значение 25, однако, как написано сейчас, это не работает, и я перепробовал все, чтобы попытаться получить доступ к значению в массиве одиночных объектов, но ничего не работает. Я нашел этот вопрос переполнения стека, который был похож, но он не работает для моей ситуации, потому что я продолжаю получать сообщение о том, что температура_ c имеет тип any и не имеет подписок.

1 Ответ

1 голос
/ 27 апреля 2020

Проблема в том, что вы не можете привести к String массив, вы должны попытаться преобразовать его в [String]. Поэтому можно изменить код на:

self.Temperature.text = (temperature_c as? [String])?.first ?? "Not available"

Давайте go шаг за шагом:

  1. temperature_c as? [String] пытается преобразовать NSDictionary в массив String, который является ожидаемый тип.
  2. Поскольку предыдущий шаг может вернуть nil, мы должны использовать необязательную цепочку ?. Если мы получили правильный массив, используя first, верните первый элемент массива.
  3. Поскольку оба предыдущих шага могут вернуть nil, мы можем использовать оператор объединения nil для возврата значения по умолчанию. В этом случае я использую «Недоступно», но вы можете установить любое значение.

Вы можете написать его более подробным образом, например:

     var text2Display2 = "Not available"
     if let theArray = temperature_c as? [String] {
        if let element = theArray.first {
           text2Display2 = element
        }
     }
     self.Temperature.text = text2Display2
...