Sobes.tech
Junior

Swiftте каталарды кантип аныктоо керек?

sobes.tech AI

AIден жооп

Swiftте каталар throw, throws, try жана do-catch блокторуна негизделген каталардын иштетүү системеси аркылуу кармалат.

  1. Каталарды ыргыта турган функцияларды жарыялоо: Функциянын параметрлеринен кийин throws ачкыч сөзү колдонулат.

    enum DataError: Error {
        case emptyData
        case invalidFormat
    }
    
    func processData(input: String) throws -> String {
        guard !input.isEmpty else {
            throw DataError.emptyData // Катаны ыргытабыз
        }
        // ... маалыматтарды иштетүү логикасы ...
        if input == "invalid" {
             throw DataError.invalidFormat
        }
        return "Иштетилди: \(input)"
    }
    
  2. Каталарды ыргыта турган функцияларды чакыруу: try ачкыч сөзү колдонулат.

    do { // Каталарды иштетүү блогу
        let result = try processData(input: "valid data")
        print(result) // "Иштетилди: valid data"
    } catch { // Каталарды кармоо
        print("Каталар пайда болду: \(error)")
    }
    
  3. Конкреттүү каталардын түрлөрүн кармоо: catch блокунда так катанын түрү көрсөтүлүшү мүмкүн.

    do {
        let result = try processData(input: "")
        print(result)
    } catch DataError.emptyData {
        print("Маалыматтар бош, киргизүүнү камсыз кылыңыз.")
    } catch DataError.invalidFormat {
        print("Маалыматтын форматы туура эмес.")
    } catch { // Башка бардык каталарды кармоо
        print("Күтүлбөгөн каталар: \(error)")
    }
    
  4. defer блогу: Актуалдуу чөйрөдөн чыгуу алдында аткарылат, каталар болобу же жокпу, маанилүү эмес. Ресурстарды тазалоо үчүн колдонулат.

    func openFile(_ filename: String) throws -> String {
        // Файлды ачып, анын мазмунун кайтарат деп эсептейбиз
        print("Файл ачылууда: \(filename)")
        // ... ачуу логикасы ...
    
        defer {
            // Бул код функциядан чыгуу алдында аткарылат,
            // каталар болсо да
            print("Файл жабылууда: \(filename)")
        }
    
        // ... файлды иштетүү ...
        if filename == "error.txt" {
           throw DataError.invalidFormat // Катаны ыргытабыз
        }
    
        return "Файлдын мазмуну"
    }
    
    do {
        let content = try openFile("data.txt")
        print(content)
    } catch {
        print("Файлды иштетүүдө каталар пайда болду: \(error)")
    }
    
  5. Опционалдуу try?: Опционалдык маанини кайтарат. Эгер функция катаны ыргыта турган болсо, try? nil кайтарат.

    let processedResult = try? processData(input: "") // processedResult `nil` болот
    let validResult = try? processData(input: "abc") // validResult опционалдык String болуп, мааниси "Processed: abc" болот
    
  6. Мажбурлап try!: Эгер сиз ишенсеңиз, каталар болбойт деп, колдонулат. Эгер болбосо, колдонмо катуу үзүлөт. Эскертүү менен колдонуу керек.

    // Функция катасыз иштейт деп 100% ишенсеңиз гана колдонуу керек
    let result = try! processData(input: "эч качан туура келген киргизүү")
    

do-catch негизделген система башка тилдердеги салттуу исключенияларга салыштырмалуу так жана коопсуз жол менен каталарды иштетүүнү камсыз кылат, анткени ал throws менен белгиленген функцияларды жана алардын чакырылышында (try, do-catch) ачык иштетүүнү талап кылат.