Swift中 where關鍵字的使用

語言: CN / TW / HK

Swift開源庫裡經常能看到 where 關鍵字的使用

1、用在do catch裡面

``` enum ExceptionError:Error{ case httpCode(Int) } func throwError() throws { throw ExceptionError.httpCode(500) } //do catch do{ try throwError() }catch ExceptionError.httpCode(let httpCode) where httpCode >= 500{ print("server error") }

```

2、用在switch裡面

//switch var value:(Int,String) = (1,"小明") switch value { case let (x,y) where x < 60: print("不及格") default: print("及格") }

3、for in

// for in let arrayOne = [1,2,3,4,5] let dictionary = [1:"hehe1",2:"hehe2"] for i in arrayOne where dictionary[i] != nil { print(i) }

4、與範型結合

//第一種寫法 func genericFunction<S>(str:S) where S:ExpressibleByStringLiteral{ print(str) } //第二種寫法 func genericFunction<S:ExpressibleByStringLiteral>(str:S){ print(str) }

5、與協議結合

``` //protocol protocol aProtocol{} extension aProtocol where Self:UIView{ //只給遵守myProtocol協議的UIView添加了拓展 //強大的協議拓展 可以給協議新增預設實現 面向協議程式設計的基礎 func getString() -> String{ return "string" }

} class MyView:UIView{} extension MyView:aProtocol{} let myView = MyView() let aStr = myView.getString() ```

6.版本取消

注意:以下是Swift3.0取消的 where 寫法

  1. 本來在while迴圈中也能使用的where, ``` //while swift2.0中的寫法 var arrayTwo:[Int]? = [] while let arr = arrayTwo where arr.count < 5 { arrayTwo?.append(1) }

//現在變成了這個樣子

//Swift3.0的寫法 var arrayTwo:[Int]? = [] while let arr = arrayTwo , arr.count < 5 { arrayTwo?.append(1) } ``` 2、if 和 guard

~~已不再支援 if + where 和 guard + where~~ , 用逗號,取代

``` // swift2.0中的寫法 let sString = "" if let str = sString where str == ""{ }

let string:String? = "小剛" guard let str = string where str == "小明" else { fatalError("g看錯人了") // } print("確實是小明") ```

//現在寫法 let string:String? = "小剛" guard let str = string , str == "小明" else { fatalError("g看錯人了") // } print("確實是小明")

合理的利用where關鍵字會令程式碼有更高的可讀性、更高的簡便性。