Swift关键字

Swift 关键字

inout

将值类型的对象按照应用类型传递,以按址传递的方式进行操作。

1
2
3
4
5
6
var x = 10
func test(a: inout Int) {
a += 1
print(a)
}
test(a: &x) //注意,取地址。 输出 11

除了 Int类型,诸如:CGFloat,Bool,Character,Array,struct等,这些值类型的对象都可以使用inout修饰,达到使用引用的方式传递的目的。

defer

修饰一段函数内任一段代码,使其必须在函数中的其余代码都执行完毕,函数即将结束前调用。也可以理解成将延迟执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func testDefer() {
print("start")
defer{
print("执行defer1")
}
print("函数结束")
defer{
print("执行defer2")
}
print("end")
}
testDefer()
//start
//函数结束
//end
//执行defer2
//执行defer1

throws
Swift中提供了Error协议,我们在开发中,如果要自定义自己的错误类型,一般会使用一个Enum来继承Error协议,目的是享用Error已经包含的一些特性。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
enum MyError: Error {
case error1
case error2
case error3
}
//throws的使用很简单,只需要在可能出现异常的函数或者方法后面添加throws。
经过这个关键字修饰的函数,在调用的时候,需要程序员加上do-catch来调用。
对于错误类型开发者来说,只需要使用Throws进行修饰,就保证了以后的调用者
必然需要对相应的错误进行处理(当然也可以不处理,但无论如何,错误被throw
携带出来了,以后的维护和优化不需要重新做错误处理的设计,直接加上错误处理的逻辑即可)。

func throwError(type: MyError)throws -> String{
switch type {
case .error1:
throw MyError.error1
case .error2:
throw MyError.error2
case .error3:
throw MyError.error3
}
}

do {
try throwError(type: .error1)
} catch let err as MyError {
print(err)
}

一般在请求网络时,会自定义错误类型,返回错误原因。