一些少见的 Swift 属性
Swift 有各种在苹果文档中鲜有记载或未记载的属性。他们正等待着你们去使用。让我们看看有哪些:
@INLINE
这个属性提供编译器内联提示。有效的值为 __always
和 never
。除非我非常确定需要,否者我不会使用这个(特别是 __always
)。关于它的使用方式还不是很清楚。在一些有限的测试中它还能生效,但不同测试环境效果也可能不同。
修改:进一步解释,尽管 LLVM 有强制内联的概念,但我们现在并不清楚这个属性是否与其直接关联。我们也不清楚是否有大小限制导致编译器忽略它,跳过内联。理论上它本应该有这个行为,但是我不敢保证它有。
记住 @inline
属性在 debug 编译下会被忽略(当 optimization 被关闭)。
(译者注:关于 optimization 可以看这篇文章)
@TRANSPARENT
我原本不把这个列入清单。它会使编译器更早地在构建流程中进行内联函数。它的作用是使“像(Int, Int)这种非常简单的函数”不应该是一个独立的函数”
@transparent
函数是内联的,即使是在没有 optimization 的 debug 模式下, 所以像 1 + 1
这种简单函数也可以调用运行很快. 否则它的作用就像是 @inline(__always)
.
@AVAILABILITY
这个属性标记那些只在某些特定版本或平台上有效的对象。第一个参数是平台。可以是 *
(所有)、iOS
或 OSX
。如果需要针对多个不同平台,可以指定多个 @availability
属性。
第二个参数可以是 unavailable
,表明对于给定的平台不可用。相对地,你可以声明一个或多个版本的组合:introduced
, deprecated
, 和 obsoleted
。Obsoleted 意味着已被移除,deprecated 表示如果使用就会给出警告。最后一个参数你可以添加 message
,当被使用的时候,编译器会输出这些提示。一些例子:
1 2 3 4 5 6 7 8 9 |
@availability(*, unavailable) func foo() {} @availability(iOS, unavailable, message="you can't call this") func foo2() {} @availability(OSX, introduced=10.4, deprecated=10.6, obsoleted=10.10) @availability(iOS, introduced=5.0, deprecated=7.0) func foo3() {} |
@NORETURN
如同名字的意思一样,编译器会假定这个函数是一个永恒 run loop 的开始,while true { }
,或者假定这个函数终结、退出当前进程。
修改:有评论说如果你调用另一个被 @noreturn
标记的函数,这个编译器会无视一个忘记返回值的函数,因为它了解控制流。
@ASMNAME
给函数、方法、或属性的实现一个标记名字。如果你找到了参数和他们的类型说明,使用这个标记你可以调用 Swift 内部标准库的函数…或者甚至是没有头文件的 C 函数,@asmname("function") func f()
。
@UNSAFE_NO_OBJC_TAGGED_POINTER
这个标记仍然是一个迷,但我猜是用来告诉编译器,当桥接 Objective-C 时不要使用 tagged pointers。
(译者注:tagged pointers
。)
@SEMANTICS
另外一个谜。参数似乎是 string 类型,类似 array.mutate_unknown
或 array.init
。这大概会告诉编译器(或静态分析器)一些函数行为的信息。
总结
是否已经玩腻了 @objc
和 @autoclosure
,试试这些。