Swift語言那些鮮為人知的特性

jopen 9年前發布 | 11K 次閱讀 Swift Apple Swift開發

摘要:Swift語言中存在著各種各樣缺乏或沒有文檔記錄的特性等著被開發者使用,盡管鮮為人知但卻非常有用,本文作者對其中的一些特性進行了介紹。

Swift語言有各種各樣缺乏(或沒有)文檔記錄的特性(attribute)放在那里等著被使用。讓我們一起看看其中的一些特性:

@inline

這個特性為編譯器提供了內聯提示。有效的取值是__always和never。除非我認為必須要用這兩個值,否則就不會使用它(特別是__always)。到目前為止與其相關的規則還不是很明確,在有限的測試下,它可以正常地工作,但還要視具體情況而定。

進一步的解釋:盡管底層虛擬機(Low Level Virtual Machine, LLVM)有強制內聯的概念,但我們目前還不知道這個@inline特性是否與其直接映射,也不知道是否存在大小方面的限制,但這將會導致編譯器忽略這一點而跳過內聯。理論上說應該是這樣的,但我不保證一定是。

注意(當優化設置關閉時)在調試模式下的構建將忽略@inline。

@transparent

我最初并未將這個特性列出來。該特性會導致編譯器在管道(pipeline)中更早地將函數內聯。它用于“像+(Int, Int)這樣非常原始的函數”,而“不應該用于獨立函數”

甚至在沒有優化設置的調試模式下@transparent特性函數就會被內聯,所以在調用“1+1”這樣的函數的時候并不會特別慢。另外這個特性與@inline(__always)非常類似。

@availability

這個特性可以用來標識某些函數只在某些平臺或版本上可用。第一個參數是平臺,可以用星號(*)代表一切可用,還可以是iOS或OS X。因為如果需要針對不同的平臺,就要指定多個@availability屬性。

如果需要表示該函數在某個給定的平臺完全不可用時,可以將第二個參數置為unavailable。此外,還可以用introduced,deprecated和obsoleted來指定一個或是多個版本的組合:obsoleted意味著該項已經刪除,deprecated僅僅表示如果使用就會給予警告。最后你可以設置message的值,如果該項被使用了就由編譯器輸出。下面是一些例子:


@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() {}</pre><b>@noreturn</b>


正如該特性所描述的那樣:編譯器可以假定這個函數是一個永遠循環運行的起點,例如while true { },或者假定是函數abort或者exit進程的情況。

評論者Marco Masser指出,如果調用另一個被標志為@noreturn的函數,那么編譯器會忽略掉當前函數中缺失的返回值(missing return values),因為編譯器理解程序的控制流。

@asmname

該屬性給出了函數、方法或屬性實現的符號名稱。如果你已經知道對應的函數參數及其類型,那么就可以直接調用Swift的內部標準庫函數,甚至不用頭文件,也可以方便地調用C語言編寫的函數:


@asmname("function") func f()


@unsafe_no_objc_tagged_pointer

上面這個仍然是個謎,但我猜測它是在告訴Swift與Objective-C聯系的時候不要使用tagged pointer。

@semantics

這又是另一個謎。參數看起來像是array.mutate_unknown或array.init這樣的字符串數組。想必這是要告訴編譯器(或靜態分析器)函數是如何工作的。

結論

誰還需要乏味老套的@objc和@autoclosure呢?還是算了吧!

(翻譯/白云鵬 友情審校/張揮戈、汪洋)

文章來源:Russ Bishop

作者簡介:Russ Bishop 全能型程序員,使用C#、Objective-C和Swift語言編程,開發了奇特的應用Storm Sim Free,博客:http://www.russbishop.net/

譯者簡介:白云鵬,移動應用開發者,個人博客:http://baiyunpeng.com


</div>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!