一些少見的 Swift 屬性

nathanw發表於2015-08-27

一些少見的 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,試試這些。

相關文章