Manipularea funcția erori

0

Problema

Nu înțeleg de documentare cum să facă eroare de manipulare, am urmatoarele:

func myFunc() async -> TransactionsClassAModel {
    let url = URL(string: "..."))
    
    let undecodedData = try! await networkingTools.afRequest(url: url!)
    let decodedData = try! JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData)
    
    return decodedData
}

Am incercat ceva de genul:

do {
    let undecodedData = try await networkingTools.afRequest(url: url!)
    try JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData)
} catch {
    print("error: ", error)
}

și întoarcerea spune în declarație Cannot find 'decodedData' in scope și un avertisment: Result of call to 'decode(_:from:)' is unused

Poate cineva sa-mi explice cum funcționează acest lucru, vă rog.

Multumesc

swift
2021-11-23 20:30:01
1

Cel mai bun răspuns

0

Cel mai simplu fix este de a crea unul do bloc, de la care te întorci dacă totul este în regulă. Și un bloc catch care se va întâmpla dacă ceva nu este în regulă. Aveți, de asemenea, pentru a regla funcția semnătura pentru a reveni valoare opțională, deoarece în caz de eșec, probabil, nu va avea o TransactionsClassAModel:

func myFunc() async -> TransactionsClassAModel? {

    let url = URL(string: "...")

    do {

        let undecodedData = try await networkingTools.afRequest(url: url!)
        let decodedData = try JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData)
        /* do anything you need */
        return decodedData // success
    } catch {
        print(error)
        return nil // no object in this case
    }
}

puteți, de asemenea, blocuri separate, astfel încât fiecare încercare este în propriul său bloc, de exemplu:

func myFunc() async -> TransactionsClassAModel? {

    let url = URL(string: "...")

    var undecodedData: Data // or optional Data? if function can return nil
    do {
        let undecodedData = try await networkingTools.afRequest(url: url!)
    } catch {
        print("Failed in afReqest: \(error)")
        return nil
    }

    var decodedData: TransactionClassModel?
    do {
        decodedData = try JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData)
    } catch {
        print("Failed in decode: \(error)")
        return nil
    }
    return decodedData
}

Puteți, de asemenea, separate de decodare a datelor în funcție privată, și a reveni pe funcția de apel:

private func decodeMyData(_ undecodedData; Data) -> TransactionsClassAModel? {
    do {
        return try JSONDecoder().decode(TransactionsClassAModel.self, from: undecodedData)
    } catch {
        print("Failed in decode: \(error)")
        return nil
    }
}

func myFunc() async -> TransactionsClassAModel? {

    let url = URL(string: "...")

    do {
        let undecodedData = try await networkingTools.afRequest(url: url!)
        return decodeMyData(undecodedData)
    } catch {
        print("Failed in afReqest: \(error)")
        return nil
    }
}
2021-11-23 23:01:03

ohhhh deci revenirea merge în interiorul prinde la fel de bine! O mulțime de exemple în acest răspuns, vă mulțumesc!! Studiind-o, după cum am scrie acest lucru.
Albert

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................