JSON возврат ноль чек? - PullRequest
       13

JSON возврат ноль чек?

0 голосов
/ 15 апреля 2020
struct AltWX: Decodable {
var raw: String
}

typealias AltMetarDecode = [String: AltWX]



do 
{ 
    let aero = try decoder.decode(AltMetarDecode.self, from: data) 
    DispatchQueue.main.async {
        if self.DownloadOrderCode == 3 
        {
            if let Ab = aero[ICAO1]
            {
                self.Alternate1Metar.text = Ab.raw
                UserDefaults.standard.set(Ab.raw, forKey: "MetarCodeAlt1")
            }
        }
        ...

Приведенный выше код обращается к Json следующим образом:

"xxxx": { "raw": "Test" 

, поэтому Ab.raw будет выводить Test

Как добавить проверку на наличие ошибок, чтобы проверить, является ли ICAO1 существует, а также если Ab.raw существует, и если какие-либо значения равны нулю, возвращать что-то? Я прочитал обычные ответы на уловы на Json, но не уверен, как отформатировать его для этого случая, особенно потому, что у меня много кодов заказов, и каждый должен проверяться отдельно.

Ответы [ 2 ]

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

Я думаю, вам нужен блок do try catch для этого.


enum ContentError: Error {
    case missingICAO1
    case missingRaw
    case orderCodeError
}

// not sure of the return types from the decode block ???
func setValues(values: AltMetarDecode) throws {
   guard self.DownloadOrderCode == 3 else { throw ContentError.orderCodeError }
   guard let Ab = values[ICA01] else { throw ContentError.missingICA01 }
   guard Ab.raw != nil else { throw ContentError.missingRaw }

   self.Alternate1Metar.test = Ab.raw
   UserDefaults.standard.set(Ab.raw, forKey: "MetarCodeAlt1")
}

do {
   let aero = try decoder.decode(AltMetaDecode.self, from data)
   try DispatchQueue.main.async {
      setValues(values: aero)
   }
} catch {
   print(error)
}

Настройка функции для выдачи ошибок может быть не самым эффективным способом кода, но для меня это делает код понятным и читабельным .

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

Это проверяет, существует ли ICAO1 и пусто ли raw

if let raw = aero["ICAO1"]?.raw, raw.isEmpty {

}

Назовите переменные в нижнем регистре в соответствии с соглашением об именах.

...