swift 函数相关修饰符

265 阅读1分钟

1. mutating

构体和枚举是值类型,默认情况下,值类型的属性不能被自身的实例方法修改,在 func 关键字前加 mutating 可以允许这种修改行为。

2. inout

inout - 输入输出参数(In-Out Parameter)。可以用 inout 定义一个输入输出参数,可以在函数内部修改外部实参的值。inout 需要注意的有以下几个点:

  • 可变参数不能标记为 inout。
  • inout 参数不能有默认值。
  • inout 参数只能传入可以被多次赋值的。
  • inout 参数的本质是地址传递(引用传递)。

3. @discardableResult

在 func 前面加个 @discardableResult,可以消除:函数调用后返回值未被使用的警告⚠。

4. final

  • 被 final 修饰的类,禁止被继承。
  • 被 final 修饰的方法、下标、属性,禁止被重写。并且添加了 final 关键字的函数无法被重写,使用静态派发,不会在 vtable 中出现,且对 objc 运行时不可⻅。

5. dynamic

函数均可添加 dynamic 关键字,为非 objc 类和值类型的函数赋予动态性,但派发 方式还是函数表派发。

6.@objc

该关键字可以将 Swift 函数暴露给 objc 运行时,与 OC 交互,但依旧是函数表派发。

那么,@objc + dynamic 就会变成消息派发的方式-也就是 OC 中的消息传递。