ခဏလေး ဒီလိုပဲ စဉ်းစားကြည့်
ဒီ 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 နမူနာ
// 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
}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 ဖြစ်တတ်ပါတယ်။