swift3.0 新认识的几个关键字

http://mp.weixin.qq.com/s?__biz=MzAxMzE2Mjc2Ng==&mid=2652155868&idx=3&sn=4f578caf8c64229558832038d61623c0&chksm=8046cfbdb73146ab86804cd1dc996894fc99cfb005101b4e872ba812c96ded925ab838c30697&mpshare=1&scene=1&srcid=0207XJe64WV2wj3rDacNZ6iw#rd

读了这篇文章新认识几个关键字在此做一下纪录:

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也在函数执行后才会执行。

你可能感兴趣的:(swift3.0 新认识的几个关键字)