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