Swift公有“@”註解屬性的全面介紹

你是否聽說過Swift語言的屬性?在這篇文章中我收集了所有的Swift註解屬性並簡單地介紹了各個屬性的意義。

公有屬性

公有的Swift語言屬性用“@”標記,類似於java中的註解,這些屬性絕大多數都有正規的文檔記載並且可以在代碼中使用。我們接下來就對全部的公有屬性進行介紹,其中的大多數屬性看起來都很熟悉。

@IBOutlet

如果你用@IBOutlet屬性標記一個屬性,那麼Interface BuilderIB)將識別那個變量,並且你將能夠通過提供的“outlet”機制將你的源代碼與你的XIB或者Storyboard連接起來。

@IBAction

@IBOutlet類似,@IBAction同樣是連接代碼和Interface Builder的橋樑,只不過@IBAction連接的是func函數,而不是屬性。被標記的方法將直接接收由用戶界面觸發的事件。

@IBInspectable, @GKInspectable

我們經常用Interface Builder的屬性編輯面板對控件的屬性進行設置,但是還有一些屬性並沒有暴露在Interface Builder的設置面板中。用@IBInspectable標記一個NSCodable的屬性將會使它可以很容易地在Interface Builder的屬性面板編輯器中進行編輯。@GKInspectable@IBInspectable有着相同的行爲,但是該屬性主要用在SpriteKitUI編輯器中而不是IB中(面向遊戲開發)。


@IBDesignable

當給一個UIView或者NSView的子類應用@IBDesignable時,這個類就可以顯示在Interface Builder中,使我們的代碼變得“所見即所寫”,我們對代碼的修改也可以實時的反饋在Interface Builder中。

@UIApplicationMain, @NSApplicationMain

這個屬性使被標記的類作爲本應用的代理。通常來說,這個代理類都是系統自動創建的AppDelegate.swift文件。如果你不想用@UIApplicationMain這個註解,你可以自己手動創建一個main.swift文件並且在這個文件中調用UIApplicationMain的方法。這個文件會代替@UIApplicationMain的作用。不過,請不要這麼做!!!

@available

通過@available使得被標記的方法或屬性適用於不同的平臺或系統版本。


@NSCopying

你可以用這個屬性標記一個屬性來複制它,而不是屬性本身的值。顯然,當您複製引用類型時,這是非常有用的。

@NSManaged

如果你使用了Core Data的實體類(通常是NSManagedObject的子類),你可以將存儲的變量或實例方法標記爲@NSManaged,以表明Core Data框架會在運行時動態地提供實現。

@objcMembers

通常在項目中如果想把Swift寫的API暴露給Objective-C調用,需要增加@objc。這個@objcMembers是一個便捷方法來標記一個類的全部方法都加上@objc。不過這個屬性會引起性能問題。

@escaping

如果你希望被標記的值可以存儲起來以便後續代碼繼續使用,你可以將閉包的參數標記爲@escaping,換句話說,被標記的值的可以超越原來的生命週期範圍,被外界調用。

@discardableResult

默認情況下,如果調用一個函數,但函數的返回值並未使用,那麼編譯器會發出警告。你可以通過給func使用@discardableResult來抑制警告。

@autoclosure

這個註解比較難以解釋:如果一個func有一個閉包參數,這個閉包參數沒有形參但有返回類型。@autoclosure可以神奇地把這樣的func轉換成有一個參數且這個參數的類型就是閉包的返回值類型的func。這樣的好處是在調用這個帶閉包的func時,傳的實參不用非得是閉包類型,只要是閉包返回值類型的就可以了,@autoclosure會自動把這個值轉換成閉包類型。

@testable

當你想要在測試類中導入某些模塊以進行單元測試時就會用到這個註解。在一般情況下,被聲明爲internal的方法和屬性是模塊內部訪問的,在模塊之外是不可以被訪問的。然而,單元測試要求我們能訪問到internal的方法或屬性,因此我們可以在單元測試文件中import需要測試的模塊前添加@testable。不過,被聲明爲privatefileprivate的內容依然不能被訪問。

@objc

這個屬性就是關聯Swift對象和OC對象的橋樑。你還可以通過@objc提供一個標識符,這個標識符就是對應到OC中的類或方法。

@nonobjc

使用這個屬性來禁止隱式添加@objc屬性。@nonobjc告訴編譯器當前聲明的內容不能在OC中使用,即便它在OC中可以被表示。

@convention

這個註解也比較難以解釋:它用來修飾func,而且它還帶有一個參數,這個參數的取值一般是:swiftcblock。被修飾的func可以用來匹配其他語言平臺的函數指針類型的形參。例如:

1. 當調用C函數的時候,可以傳入被@convention(c)修飾的swift函數,來匹配C函數形參中的函數指針。

2. 當調用OC方法的時候,可以傳入被@convention(block)修飾的swift函數,來匹配OC方法形參中的block參數。

以上就是Swift全部的公有“@”註解屬性的介紹,其中絕大部分都比較熟悉了。當然,Swift還有很多私有的註解屬性。私有屬性只能由語言的創建者或核心開發人員使用,他們提供了額外的編譯器功能。所以,如果你要使用這些私有屬性,請一定小心。

我們會在下一篇文章中介紹Swift的私有屬性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章