@inline inout

内联函数

如果开启了编译器优化(Release模式默认会开启优化),编译器会自动将某些函数变成内联函数.即将函数调用展开为函数体.

开启了编译器优化路径:


image.png
  • 函数体比较长
  • 包含递归调用
  • 包含动态派发

以上这些情况比编译器不会自动内联

//永远不会被内联(即使开启了编译器优化)
@inline(never) func test() {
        print("1")
    }
//开启编译器优化后.即使代码很长,也会被内联(递归调用函数,动态派发的函数除外)
@inline(__always) func test() {
        print("1")
    }

Release模式下,编译器已经开启优化,会自动决定那些函数需要内联,因此没必要使用@inline

输入输出参数(In - Out Parameter)

  • 可变参数不能标记为inout
  • inout参数不能有默认值
  • inout参数只能传入可以被多次赋值的(不能是 let)
func swapValues(_ v1: inout Int,_ v2: inout Int) {
        (v1,v2) = (v2,v1)
    }
var num1 = 1
var num2 = 1
swapValues(&num1, &num2)
  • 上述代码中的inout参数的本质是地址传递(引用传递)
  • 如果传递给inout参数的是计算属性,有监听属性等内容,其本质是非引用传递.

你可能感兴趣的:(@inline inout)