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