在Swift语法里where关键字的作用跟SQL的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. 与范型结合
//第一种写法
// 在使用泛型的时候也常常用到where对泛型加以限制
func genericFunction<S>(str:S) where S:ExpressibleByStringLiteral{
print(str)
}
//第二种写法
func genericFunction<S:ExpressibleByStringLiteral>(str:S){
print(str)
}
5. 与协议结合
protocol SomeProtocol {
func someMethod()
}
class A: SomeProtocol {
let a = 1
func someMethod() {
print("call someMethod")
}
}
class B {
let a = 2
}
//基类A继承了SomeProtocol协议才能添加扩展
extension SomeProtocol where Self: A {
func showParamA() {
print(self.a)
}
}
//反例,不符合where条件
extension SomeProtocol where Self: B {
func showParamA() {
print(self.a)
}
}
let objA = A()
let objB = B() //类B没实现SomeProtocol, 所有没有协议方法
objA.showParamA() //输出1