读了这篇文章新认识几个关键字在此做一下纪录:
1 @discardableResult
@discardableResult
prefix func ++(x: inout Int) -> Int {
x += 1
return x
}
使用于带有返回值的函数,当不使用的时候不会再显示warning
2 inout
同样看上面的代码,inout修饰的变量会影响外部,参考OC的 __block, 类似C的&参数地址传递, 解释如下:
Swift 中 struct 是值类型的。
何为值,值是不能改变的,是immutable的,任何对值的修改其实就是新构造了一个来替换原来的。这里的inout也是如此,并不是传了地址进来,而是在这里构造了一个新的结构体,当函数结束时会复制回去替换原来的结构体。
当然,这个复制并不一定会真的复制。Swift 的copy on write也会分情况,当值类型的引用只有一个时是不会复制的,这段在猫神的书里有提到。
3 prefix & postfix
这个简单,是自定义运算符的时候使用 prefix->前置;postfix->后置。
4 defer
@discardableResult
postfix func ++(x: inout Int) -> Int {
defer {
x += 1
}
return x
}
defer是标志延迟执行的代码块。上面的代码块就是先return再执行defer,类似swift的错误处理final最后执行。可想而知如果return的是一个函数,那么defer也在函数执行后才会执行。