一些少见的 Swift 属性

541 查看

一些少见的 Swift 属性

Swift 有各种在苹果文档中鲜有记载或未记载的属性。他们正等待着你们去使用。让我们看看有哪些:

@INLINE

这个属性提供编译器内联提示。有效的值为 __alwaysnever。除非我非常确定需要,否者我不会使用这个(特别是 __always)。关于它的使用方式还不是很清楚。在一些有限的测试中它还能生效,但不同测试环境效果也可能不同。

修改:进一步解释,尽管 LLVM 有强制内联的概念,但我们现在并不清楚这个属性是否与其直接关联。我们也不清楚是否有大小限制导致编译器忽略它,跳过内联。理论上它本应该有这个行为,但是我不敢保证它有。

记住 @inline 属性在 debug 编译下会被忽略(当 optimization 被关闭)。

(译者注:关于 optimization 可以看这篇文章)

@TRANSPARENT

我原本不把这个列入清单。它会使编译器更早地在构建流程中进行内联函数。它的作用是使“像(Int, Int)这种非常简单的函数”不应该是一个独立的函数”

@transparent 函数是内联的,即使是在没有 optimization 的 debug 模式下, 所以像 1 + 1 这种简单函数也可以调用运行很快. 否则它的作用就像是 @inline(__always).

@AVAILABILITY

这个属性标记那些只在某些特定版本或平台上有效的对象。第一个参数是平台。可以是 *(所有)、iOSOSX。如果需要针对多个不同平台,可以指定多个 @availability 属性。

第二个参数可以是 unavailable,表明对于给定的平台不可用。相对地,你可以声明一个或多个版本的组合:introduced, deprecated, 和 obsoleted。Obsoleted 意味着已被移除,deprecated 表示如果使用就会给出警告。最后一个参数你可以添加 message,当被使用的时候,编译器会输出这些提示。一些例子:

@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_unknownarray.init。这大概会告诉编译器(或静态分析器)一些函数行为的信息。

总结

是否已经玩腻了 @objc@autoclosure,试试这些。