Thuta Learning
ရှာဖွေရန်
ExercisesProgrammingbeginner

Exercise Set 2: Struct, Protocol & Error Handling Practice

စိတ်လျှော့ပါ။ ဒီခန်းကို စာအုပ်လိုမဟုတ်ဘဲ စကားပြောသလိုပဲ၊ နားလည်လွယ်အောင် ရှင်းပါမယ်။

ဒီခန်းပြီးရင် ဘာတတ်သွားမလဲ

  • Exercise Set 2: Struct, Protocol & Error Handling Practice ကို ကိုယ်တိုင် လေ့ကျင့်ကြည့်မယ်
  • သင်ခဲ့ပြီးသား skill တွေကို practice လုပ်ပြီး ခိုင်မာအောင်လုပ်မယ်
  • အမှားရှာ၊ ပြင်တတ်၊ ကိုယ်တိုင် check လုပ်တတ်မယ်

ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်

ဒီ exercise set က Exercise Set 1 ထက် difficulty level မြင့်ပြီး Intermediate/Advanced chapter မှာ သင်ခဲ့တဲ့ protocol, closure, enum with associated value, error handling topic တွေကို ပေါင်းစပ် practice လုပ်ဖို့ ရည်ရွယ်ထားပါတယ်။ Teaching content အသစ် မဟုတ်ဘဲ concept တွေကို ကိုယ်တိုင် code ရေးပြီး apply လုပ်တဲ့ self-test ဖြစ်ပါတယ်။ Task တွေက Task Manager project ထက် independent ဖြစ်ပြီး concept တစ်ခုချင်းစီကို isolated အနေနဲ့ practice လုပ်နိုင်အောင် ဒီဇိုင်းလုပ်ထားပါတယ်။ ဖြေပြီးတိုင်း compile error တွေကို ကိုယ်တိုင် ဖတ်ပြီး fix ကြည့်ပါ။

လေ့ကျင့်ခန်းများ

Task 1: Shape ဆိုတဲ့ protocol ကို var area: Double { get } requirement နဲ့ ဆောက်ပြီး Circle နဲ့ Rectangle struct နှစ်ခုကို conform လုပ်ကြည့်ပါ။ Task 2: [Circle] array တစ်ခု ဆောက်ပြီး closure-based sorted(by:) သုံးကာ area ငယ်ကနေ ကြီးအထိ sort လုပ်ပါ။ Task 3: NetworkResult ဆိုတဲ့ enum ကို success(data: String) နဲ့ failure(reason: String) associated value နှစ်ခုနဲ့ ဆောက်ပြီး switch statement နဲ့ case နှစ်ခုစလုံးကို handle ပါ။ Task 4: validateAge(_ age: Int) throws -> Int function ရေးပြီး age 0 အောက် (သို့) 120 အထက်ဆိုရင် custom Error enum (InvalidAgeError) throw ကာ do-catch နဲ့ handle ပါ။

Code နမူနာ

swift
// Task 1
protocol Shape {
    var area: Double { get }
}

struct Circle: Shape {
    let radius: Double
    var area: Double {
        // TODO: implement
        return 0
    }
}

struct Rectangle: Shape {
    let width: Double
    let height: Double
    var area: Double {
        // TODO: implement
        return 0
    }
}

// Task 2
let circles = [Circle(radius: 3), Circle(radius: 1), Circle(radius: 2)]
// TODO: sorted(by:) closure

// Task 3
enum NetworkResult {
    case success(data: String)
    case failure(reason: String)
}
// TODO: switch statement

// Task 4
enum InvalidAgeError: Error {
    case outOfRange
}
func validateAge(_ age: Int) throws -> Int {
    // TODO: implement
    return age
}
You should see
Circle/Rectangle area calculation တွေ correct ဖြစ်ပြီး circles array က radius order (1, 2, 3) အတိုင်း sort ဖြစ်ကာ, validateAge(150) ခေါ်ရင် InvalidAgeError.outOfRange error ကို catch block က correct စွာ ဖမ်းရမှာဖြစ်ပါတယ်။

၅ မိနစ် စမ်းကြည့်

Task 3 ရဲ့ NetworkResult enum ထဲကို loading case တစ်ခု ထပ်ထည့်ပြီး switch statement ကို exhaustive ဖြစ်အောင် update လုပ်ကြည့်ပါ- 5 minute လောက် ကိုယ်တိုင် ကြိုးစားကြည့်ပါ။

သတိလေးတစ်ချက်

Associated value ပါတဲ့ enum ကို switch လုပ်တဲ့အခါ case အားလုံးကို cover ဖို့ လိုပါတယ် - default case ကို အလွယ်တကူ သုံးလိုက်ရင် enum ထဲ case အသစ်ထပ်ထည့်ချိန် compiler warning မပေးတော့ဘဲ logic bug ဖြစ်တတ်ပါတယ်။

ဒီနေရာမှာ လူအများမှားတတ်တယ်

  • protocol requirement ကို { get } declare ထားပေမယ့် implement လုပ်တဲ့အခါ stored property အနေနဲ့ ထားပြီး computed property logic ကို လုံးဝ မထည့်တတ်ကြတယ်
  • throws function ကနေ error catch လုပ်တဲ့အခါ switch-style pattern matching (catch InvalidAgeError.outOfRange) ကို မသုံးဘဲ general catch { } တစ်ခုတည်းနဲ့ error detail ဆုံးရှုံးတတ်ကြတယ်

အခု ကိုယ်တိုင် စမ်းကြည့်

Task 3 ရဲ့ NetworkResult enum ထဲကို loading case တစ်ခု ထပ်ထည့်ပြီး switch statement ကို exhaustive ဖြစ်အောင် update လုပ်ကြည့်ပါ- 5 minute လောက် ကိုယ်တိုင် ကြိုးစားကြည့်ပါ။

You'll know it worked when: Circle/Rectangle area calculation တွေ correct ဖြစ်ပြီး circles array က radius order (1, 2, 3) အတိုင်း sort ဖြစ်ကာ, validateAge(150) ခေါ်ရင် InvalidAgeError.outOfRange error ကို catch block က correct စွာ ဖမ်းရမှာဖြစ်ပါတယ်။

Exercise Set 2: Struct, Protocol & Error Handling Practice | Thuta Learning