Swift guard 和 if的使用

2021-08-21 17:35:56 字數 2143 閱讀 3957

swift 2.0 帶來了guard語句。但很多人還是不太理解guard的意義,特別是和 swift 2.0 之前的簡單if語句相比較。我們知道,所有的 guard 使用場景都可以用 if 來替代,那麼為什麼還要增加 guard 特性呢?其最最主要的原因還是 guard 語法的可讀性更強。這裡我們使用乙個錯誤處理的例子,乙個帶有姓名和年齡的簡單**。

使用guard實現,**為:

struct person 

struct personviewmodel

func createperson() throws -> person

guard let ageformatted = int(age) else

return person(name: name, age: ageformatted)

}}

如果使用if實現createperson()方法,**為:

enum personresult 

func createpersonnoguard() -> personresult else

} else

}

這些情況下 guard 要慎用

但是,並不意味著要將所有的 if … else … 和 if let … 都替換成 guard 語法。guard 語法很容易被濫用和誤用,並不是所有的**層次結構中都適合 guard 的使用。

作為 if 的相反情況可以理解為作用域內的**只有在傳遞進來的條件被判斷為 false 的時候才執行.

例如當我們需要判斷乙個閉包參數列列中的 error 引數是否有返回值的時候,當 error 為 nil 時我們才有必要執行作用域內的**,反之 return。

這種情況下用 if 去實現就十分的清晰,可讀性更高:

geocoder.geocodeaddressstring(textstr)   

// 如果有結果,那麼看一下結果是否為空,為空退出

guard let placemarks = placemarks else

// 遍歷所有的座標(經緯度)

for place in placemarks

}

如果用 guard 去處理上面的 error,那麼**就變成了這樣:

geocoder.geocodeaddressstring(textstr)   

// 遍歷所有的座標(經緯度)

for place in placemarks

} // 作用域**(存在 error,程式結束)

print("error --- \(error)")

return

}

顯然,用 guard 去處理上述情況就非常的不妥,造成了 guard 的大括號內還巢狀了乙個 for 迴圈,可讀性大大降低。

換句話說,如果你想讓這個引數有值並使用它,那麼就用 guard,如果你不想讓這個引數有值那麼就用 if 去判斷。這樣就可以將錯誤以及之後的 return 集中在乙個大括號內,而順利執行的作用域**就在大括號外了。增強了**的可讀性。

guard 的 else 語句中,不應該放大量的**,除了簡單的提前退出的語句外。如果你在 guard 的 else **塊中用了其他的**邏輯或是實現了任何實際功能,那麼你就誤用了 guard 了。

總之,除一些簡單提前退出的語句和一些離開了當前函式的必要操作外,不應該有其他的**。

最好在 guard 的 else 語句塊內不要多過 2 ~ 3 行**。

下面一段**採用 if else 實現:

var str : string? = "hello"

iflet hellostr = str where str!.hasprefix("h") else

若採用 guard 去實現為:

var str : string? = "hello"  

guard let hellostr2 = str where str!.hasprefix("h") else

print(hellostr2)

對於這種簡單的情況而言,使用 if else 語句比起沒有分支的 guard 語法更加容易理解。

apply call bind和this的使用

立即呼叫fun,同時將fun函式原來的this指向傳入的新context物件,實現同乙個方法在不同物件上重複使用。context 傳入的物件,替代fun函式原來的this argsarray 乙個陣列或者類陣列物件,其中的陣列引數會被展開作為單獨的實參傳給 fun 函式,需要注意引數的順序。fun....

IPhone CoreImage 的介紹和使用

1.coreimage的簡單介紹 2.coreimage的使用 2.1在ios開發中匯入coreimage.framework 框架,mac開發中coreimage包含在quartzcore.framework框架中。2.2 coreimage使用中3個主要的類 cicontext 他與core g...

frame bounds和center的使用場景

frame bounds和center的使用場景 一般來說,bounds屬性比較少用,通常使用frame來設定檢視的大小和位置,使用center來改變 移動 檢視的位置 也可用frame來改變位置 另外,對檢視進行旋轉 縮放也都是相對於center進行操作的。from frame和bounds是ui...