@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 | func add(a: Int, b: @autoclosure () -> Int) -> Int { |
参考:
What is the autoclosure attribute?
Using @autoclosure when designing Swift APIs 推荐。具体的一些使用场景
@frozen
用于枚举和结构体的声名。frozen冰冻,顾名思义就是这个枚举或结构体应该被严格限制改变,你不能去添加或删除、重排case或属性等等操作。和frozen类型交互时编译器会进行一些额外的优化。
final
表示不允许对其修饰的内容进行继承或者重写等。Swift中,final关键字可以在class、func和var前修饰。final的作用:
- 权限控制。(主要作用)
- 提升程序性能 。(微优化)
@objc
把Swift代码(类,方法,属性等)暴露给OC,这样OC代码才能访问。混编时用到。
dynamic
让方法调用时走OC的动态派发,由于运行时是OC的特性,所以需要配合@objc使用。在几种方法派发里面是性能最低的。
参考:To the depth of @objc and dynamic in Swift
参考
Attributes 关键字官方文档。