0%

Swift中的关键字

@inline

说明:函数内联,一种编译器优化技术。声明内联的函数,编译器会把该函数调用的地方用它的实现替换有点类似C语言的宏,这样就减少了函数的调用开销,属于一种微优化,如果函数实现简单,调用非常频繁可以使用内联进行优化。由于内联是把函数调用的地方用它的实现替换,因此内联可能会让程序的二进制包变大,取决于编译优化等级,编译器可能会自动对一些频繁调用的函数进行内联,如果这个函数实现比较复杂,那么此时的内联可能弊大于利,这个时候可以使用 @inline(never) 明确告知编译器关闭这一特性。@inline的另一个应用场景就是代码混淆增加逆向难度。

用法:使用@inline(__always) 和 @inline(never) 修饰函数。函数的访问权限可以是public也可以是private。

参考:The Forbidden @inline Attribute in Swift

@inlinable

说明:@inlinable 属性允许您为特定方法启用跨模块内联。这样做了之后,方法的实现将作为模块公共接口的一部分来公开,允许编译器进一步优化来自不同模块的调用。使用 @inlinable 最大的收益就是有些方法可能会有性能开销,尽管大多数的方法这种开销可以忽略不计,但像那种包含泛型和闭包的,开销很大。使用@inlinable 可以带来性能提升,不过包的大小会增加。

用法:’@inlinable’ 只能用于 public 函数,不能修饰private函数。

参考:Understanding @inlinable in Swift

@autoclosure

The @autoclosure attribute can be applied to a closure parameter for a function, and automatically creates a closure from an expression you pass in. When you call a function that uses this attribute, the code you write isn’t a closure, but it becomes a closure, which can be a bit confusing – even the official Swift reference guide warns that overusing autoclosures makes your code harder to understand.

主要用于延迟表达式的执行。1.有一些情况传入的表达式很有可能不会被执行,使用@autoclosure可以起到一点点优化作用。2.代码更加简洁,少写一对花括号。

1
2
3
4
5
6
7
8
9
func add(a: Int, b: @autoclosure () -> Int) -> Int {
if a < 0 {
return a
}
return a + b()
}

let res1 = add(a: 3, b: 3 * 1872 + 876)
let res2 = add(a: -2, b: 3 * 1872 + 876) //这种情况下参数b实际上是不会计算的。如果是普通函数的话那么在运行时会先计算出结果再传入b。DDLog也是这么干的,因为message有可能不会被打印。

参考:

What is the autoclosure attribute?

Using @autoclosure when designing Swift APIs 推荐。具体的一些使用场景

@frozen

用于枚举和结构体的声名。frozen冰冻,顾名思义就是这个枚举或结构体应该被严格限制改变,你不能去添加或删除、重排case或属性等等操作。和frozen类型交互时编译器会进行一些额外的优化。

final

表示不允许对其修饰的内容进行继承或者重写等。Swift中,final关键字可以在class、func和var前修饰。final的作用:

  1. 权限控制。(主要作用)
  2. 提升程序性能 。(微优化)

参考:Swift 特性关键字final的用法

@objc

把Swift代码(类,方法,属性等)暴露给OC,这样OC代码才能访问。混编时用到。

dynamic

让方法调用时走OC的动态派发,由于运行时是OC的特性,所以需要配合@objc使用。在几种方法派发里面是性能最低的。

参考:To the depth of @objc and dynamic in Swift

参考

Attributes 关键字官方文档。

觉得文章有帮助可以打赏一下哦!