Section 3/91 menit

3. Sintaks Dasar

3. Sintaks Dasar

Deklarasi Fungsi dengan Typed Throws

swift
enum ParseError: Error {
    case invalidFormat(String)
    case missingField(String)
    case valueOutOfRange(field: String, value: Int, range: ClosedRange<Int>)
}

// Deklarasi: hanya bisa lempar ParseError
func parseAge(_ string: String) throws(ParseError) -> Int {
    guard let number = Int(string) else {
        throw ParseError.invalidFormat("'\(string)' bukan angka")
    }
    
    guard (0...150).contains(number) else {
        throw ParseError.valueOutOfRange(field: "age", value: number, range: 0...150)
    }
    
    return number
}

// Caller: catch block punya tipe konkret, tidak perlu cast
do {
    let age = try parseAge("abc")
} catch {
    // 'error' di sini adalah ParseError — langsung akses properties-nya
    switch error {
    case .invalidFormat(let msg):
        print("Format salah: \(msg)")
    case .missingField(let field):
        print("Field hilang: \(field)")
    case .valueOutOfRange(let field, let value, let range):
        print("\(field): \(value) di luar \(range)")
    }
    // Tidak perlu 'default' — compiler tahu semua case sudah ter-cover!
}

Typed Throws + try?

swift
// try? menghasilkan Optional — error di-discard
let age: Int? = try? parseAge("25")  // Optional(25)
let bad: Int? = try? parseAge("abc") // nil

Typed Throws + try!

swift
// try! crash jika throw — gunakan hanya jika yakin tidak bisa gagal
let age = try! parseAge("25")  // 25
// let bad = try! parseAge("abc")  // CRASH: ParseError.invalidFormat