2015年9月29日 星期二

簡單介紹Swift 2.0的Guard語法

Guard是iOS在Swift 2.0中引入的一種語法
他改善了一些冗長的if寫法問題(下面範例會提到)
一般來說 guard要撘配else來使用,最好的用法(官方建議)是用在方法(method)中的return / break / continue 等流程控制

Swift的guard語法非常適合用來做optional的判斷
(概念上也可以把guard直接當做 if not 來看)

以下是簡單的範例:


// userName是個optional的值,可能是使用者輸入,或是網路來的
var userName:String?

func checkUserExists(name:String?)->Bool{
// 這裡用 底線(_) 是因為我們不是真的要值,只是想判斷optional是否有值
guard let _ = userName else{
return false
}
return true
}

checkUserExists(userName) // 輸出 false
userName = "Seachaos" // 給予userName有真正的值
checkUserExists(userName) // 輸出 true



上面範列的checkUserExists就是個簡單的例子

再來看一個滿常用到的範例,就是Dictionary (不管是Swift的Dictionary還是 NSDictionary 都適用) 的處理




// 假設這是一個是使用者輸入,或是網路來的的Dict
var userData:[String:String] = [String:String]()

// 檢查method
func checkUserDataCorrect(data:[String:String])->Bool{
// 沒有Guard以前的做法
var firstName:String!
if let aValue = userData["firstName"]{
firstName = aValue
}else{
return false
}

// 有了Guard,可以這樣用
guard let lastName = userData["lastName"] else{
return false
}
guard let name = userData["name"] else{
return false
}
// 等效於 if ! ( name == firstName + lastName )
guard name == firstName + lastName else{
return false
}
return true
}

// 不正確資料 (空資料)
checkUserDataCorrect(userData) // 輸出 false

// 不正確資料 (少了lastName 錯誤)
userData = ["name":"大明王",
"firstName":"大明"]
checkUserDataCorrect(userData) // 輸出 false

// 正確資料
userData = ["name":"大明王",
"firstName":"大明",
"lastName":"王"]



注意到以上 lastName的部份,有了Guard就可以這樣簡潔的寫
而不用像以前只能先用let來處理 (上範例 firstName)

以上是Swift 2.0加入的Guard語法簡單應用介紹