What new in Swift 2

WWDC 2015 မှာ swift 2 ကို Xcode 7 နှင့် အတူ မိတ်ဆက်ခဲ့ပါတယ်။ Swift 2 မှာ Swift 1.2 ကို အဆင့်မြှင့်တင်ထားပြီးတော့ keyword အသစ်တွေပါလာပါတယ်။

try/catch

iOS developer တွေ အနေနဲ့ try catch ကို သိပ်ပြီး ရင်းနှီးမှုမရှိလှဘူး။ Objective-C မှာလည်း try/catch မရှိတဲ့အတွက်ကြောင့် error handling အတွက် try/catch ကို မသုံးဖြစ်ခဲ့ပါဘူး။ သို့ပေမယ့် Java/C# သမားတွေ အနေနဲ့ try/catch က ထူးဆန်းတဲ့ အရာ မဟုတ်ပါဘူး။

ကျွန်တော်တို့အနေနဲ့ ကိုယ်ပိုင် Error exception တွေကို Swift 2 မှာ ကြေငြာနိုင်ပါတယ်။

enum MyError: ErrorType {
    case UserError
    case NetworkError
}

အဲဒါကတော့ ကျွန်တော်တို့ ကိုယ်ပိုင် exception ကို ErrorType နဲ့ ကြေငြာထားတာပါ။

func doFunction() throws -> String

doFunction ဆိုတဲ့ function က error throws လုပ်မယ်လို့ ဆိုထားပါတယ်။ code အပြည့်အစုံကို အောက်ကလို ရေးထားပါတယ်။

func doFunction() throws -> String {
    print("Hello")
    throw MyError.UserError
    
    return "return Value"
}

အဲဒီ code မှာ UserError ကို ကျွန်တော်တို့တွေ thorws လုပ်ခဲ့ပါတယ်။ အဲဒီလို throws လုပ်ထားတာရှိရင် try/catch နဲ့ အသုံးပြုရပါတယ်။

do {
    var res = try doFunction()
    print ("SUCCESS")
} catch {
    print("Some Error")
}

အဲဒီ code မှာ ဆိုရင်တော့ Hello ဆိုတာကို ထုတ်ပြမယ် ပြီးရင် thorw ဖြစ်သွားပြီးတော့ catch ထဲက Some Error ကို ထုတ်ပြပါမယ်။

ဘယ် Error ဆိုတာကို အတိအကျ သိရအောင်

do {
    var res = try doFunction()
    print ("SUCCESS")
} catch MyError.UserError {
    print ("User Error")
} catch {
    print ("Some Error")
}

ဒါဆိုရင် User Error catch ထဲကို ရောက်လာပါလိမ့်မယ်။

let

Swfit 1.2 မှာတုန်းက ကျွန်တော်တို့တွေ "Pyramid of doom" ကို ကြုံခဲ့ရပါတယ်။ ဥပမာ အောက်ကလို မျိုး code ပေါ့

if let a = b {
    if let c = d {
        if let e = f {
            print("Working")
        }
    }
}

အခု Swift 2 မှာတော့ တိုတိုလေးနဲ့ ရေးလို့ရပါပြီ။

if let a = b , c = d , e = f {
    print("Working")
}

guard

guard အကြောင်း မပြောခင်မှာ "Pyramid of doom" ကို ပြန်ပြောရပါအုံးမယ်။ ကျွန်တော်တို့တွေ data တွေ ရှိမရှိ ကို အောက်က code လိုမျိုး စစ်ကြပါတယ်။

if firstName != "" {
    if lastName != "" {
        if address != "" {
            // do great code
        }
    }
}

အဲဒီ code ကို ပိုပြီး ရှင်းသွားအောင် codition မညီဘူးဆိုရင် return ပြန်လိုက်ပါတယ်။

if firstName == "" { return }
if lastName == "" { return }
if address == "" { return }
// do great code

အဲဒါကို early return လို့ ခေါ်ပါတယ်။ Swift 2 မှာတော့ အဲဒီလို early return တွေကို ရှင်းသွားအောင် guard ကို အသုံးပြုနိုင်ပါတယ်။

guard age > 18 else {
    return false
}

guard #available(iOS 9, *) else {
    return
}

func printName()  {
    guard let unwrappedName = name else {
        print("You need to provide a name.")
        return
    }

    print(unwrappedName)
}

အဲဒီ code မှာဆိုရင် guard ကို အသုံးပြုထားတာကို ရှင်းရှင်းလင်းလင်း မြင်နိုင်ပါတယ်။ guard နဲ့ let ကို တွဲသုံးပြီးတော့ data မရှိခဲ့ဘူးဆိုရင် ကိစ္စတွေ ရေးလို့ရပါတယ်။

defer

defer ကတော့ code block ပြီးမှ အလုပ်လုပ်စေချင်ရင် defer ကို အသုံးပြုနိုင်ပါတယ်။

func myFunc() {
  print("Step 2")
  defer { print("Step 3") }
  print("Step 4")
}

print("Step 1")
myFunc()
print("Step 5")

ဒီ code မှာဆိုရင်တော့ output က ဒီလို မျိုး ပြပါလိမ့်မယ်။

Step 1
Step 2
Step 4
Step 3
Step 5

defer ကို အသုံးပြုထားတဲ့အတွက် defer ထဲမှာ ရှိတဲ့ code က function ပြီးသွားမှ အလုပ်လုပ်ပါတယ်။

ကျွန်တော်တို့တွေ do နဲ့လည်း တွဲသုံးနိုင်ပါတယ်။

print("Step 1")

do {
    defer { print("Step 2") }
    print("Step 3")
    print("Step 4")
}

print("Step 5")

အဲဒါဆိုရင်တော့ 1,3,4,2,5 ဆိုပြီး ထွက်လာပါမယ်။ Step 2 က do block ပြီးမှ အလုပ်လုပ်ပါတယ်။ နောက်ထပ် ဥပမာ ကို ကြည့်ရအောင်

for i in 1...10 {
  print ("In \(i)")
  defer { print ("Deferred \(i)") }
  print ("Out \(i)")
}

အဲဒီမှာဆိုရင်တော့ In , Out , Deferred ဆိုပြီး အစီအစဉ် နဲ့ loop ပတ်တာကို တွေ့ရပါလိမ့်မယ်။

Checking API availablity

Swift 2 မှာတော့ iOS version ကို လွယ်လင့် တကူ စစ်နိုင်ပါပြီ။ #available ကို အသုံးပြုပြီးတော့ စစ်ဆေးနိုင်ပါတယ်။

if #available(iOS 9, *) {
    // use UIStackView
} else {
    // show sad face emoji
}

iOS 9 နှင့် အထက် ဆိုရင် UIStackView သုံးမယ်လို့ ဆိုထားပါတယ်။

guard #available(iOS 9, *) else {
    return
}

@available ကို အသုံးပြုပြီးတော့ function တွေကို limit လုပ်ထားနိုင်ပါတယ်။

@available(iOS 7, *)
func iOS7Work() {
    // do stuff

    if #available(iOS 8, *) {
        iOS8Work()
    }
}

@available(iOS 8, *)
func iOS8Work() {
    // do stuff
    if #available(iOS 9, *) {
        iOS9Work()
    }
}

@available(iOS 9, *)
func iOS9Work() {
    // do stuff
}

iOS 9 SDK မှသာ iOS9Work က အလုပ်လုပ်မှာ ဖြစ်ပြီးတော့ iOS 7,8 စတာတွေမှာ အဲဒီ function ကို ခေါ်လို့ မရပါဘူး။ SDK , library စတာတွေ ရေးတဲ့သူတွေ အတွက် အသုံးဝင်လှပါတယ်။

Protocol-Oriented Programming

Swift 2 ဟာ Protocol-Oriented Programming ပါ။ iOS ကို လေ့လာနေတယ် Swift 2 ကို လေ့လာမယ်ဆိုရင် အရင်ဆုံး Protocol-Oriented Programming in Swift ကို ကြည့်သင့်ပါတယ်။

Download Playground Code

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.