swift新特性( nullable和

2021-07-22 07:28:50 字數 2582 閱讀 6247

在swift中,可以使用!和?來表示乙個物件是optional的還是non-optional,如view?和view!。而在objective-c中則沒有這一區分,view即可表示這個物件是optional,也可表示是non-optioanl。

這樣就會造成乙個問題:在swift與objective-c混編時,swift編譯器並不知道乙個objective-c物件到底是optional還是non-optional,因此這種情況下編譯器會隱式地將objective-c的物件當成是non-optional。

為了解決這個問題,蘋果在xcode 6.3引入了乙個objective-c的新特性:nullability annotations。

這一新特性的核心是兩個新的型別注釋:__nullable和__nonnull。從字面上我們可以猜到,__nullable表示物件可以是null或nil,而__nonnull表示物件不應該為空。當我們不遵循這一規則時,編譯器就會給出警告。

我們來看看以下的例項,

1

@inte***ce

testnullabilityclass ()

2 @property (nonatomic, copy) nsarray *items;

3 - (id)itemwithname:(nsstring *__nonnull)name;

4@end

5@implementation

testnullabilityclass

6...

7 - (void

)testnullability

10 - (id)itemwithname:(nsstring *__nonnull)name

13@end

不過這只是乙個警告,程式還是能編譯通過並執行。

事實上,在任何可以使用const關鍵字的地方都可以使用__nullable和__nonnull,不過這兩個關鍵字僅限於使用在指標型別上。而在方法的宣告中,我們還可以使用不帶下劃線的nullable和nonnull,如下所示:

1

- (nullable id)itemwithname:(nsstring * nonnull)name

在屬性宣告中,也增加了兩個相應的特性,因此上例中的items屬性可以如下宣告:

1

@property (nonatomic, copy, nonnull) nsarray * items;

當然也可以用以下這種方式:

1

@property (nonatomic, copy) nsarray * __nonnull items;

推薦使用nonnull這種方式,這樣可以讓屬性宣告看起來更清晰。

不過,為了安全起見,蘋果還制定了幾條規則:

typedef定義的型別的nullability特性通常依賴於上下文,即使是在audited regions中,也不能假定它為nonnull。

複雜的指標型別(如id *)必須顯示去指定是nonnull還是nullable。例如,指定乙個指向nullable物件的nonnull指標,可以使用」__nullable id * __nonnull」。

我們經常使用的nserror **通常是被假定為乙個指向nullable nserror物件的nullable指標。

因為nullability annotations是xcode 6.3新加入的,所以我們需要考慮之前的老**。實際上,蘋果已以幫我們處理好了這種相容問題,我們可以安全地使用它們:

老**仍然能正常工作,    即使對nonnull物件使用了nil也沒有問題。

老**在需要和swift混編時,在新的swift編譯器下會給出乙個警告。

nonnull不會影響效能。事實上,我們仍然可以在執行時去判斷我們的物件是否為nil。

事實上,我們可以將nonnull/nullable與我們的斷言和異常一起看待,其需要處理的問題都是同乙個:違反約定是乙個程式設計師的錯誤。特別是,返回值是我們可控的東西,如果返回值是nonnull的,則我們不應該返回nil,除非是為了向後相容。

nonnull區域設定(audited regions)

如果需要每個屬性或每個方法都去指定nonnull和nullable,是一件非常繁瑣的事。蘋果為了減輕我們的工作量,專門提供了兩個巨集:ns_assume_nonnull_begin和ns_assume_nonnull_end。在這兩個巨集之間的**,所有簡單指標物件都被假定為nonnull,因此我們只需要去指定那些nullable的指標。如下**所示:

ns_assume_nonnull_begin

@inte***ce

testnullabilityclass () 

@property

(nonatomic, copy) nsarray * items; 

- (id)itemwithname:(nullable nsstring *)name; 

@end

ns_assume_nonnull_end

在上面的**中,items屬性預設是nonnull的,itemwithname:方法的返回值也是nonnull,而引數是指定為nullable的。

Swift 1 2版本新特性

隨著xcode6.3正式版本的推出,swift語言也正式進入1.2版本,那麼1.2版本有什麼新特性呢?來快速了解一下吧。1.速度的提公升 速度的提公升首先體現在對工程中增量的單獨編譯,這使得我們在改動較大的工程的時候,執行速度會得到大幅度的提公升。其次體現在swift自己的執行庫的執行時性的增強。s...

swift 宣告特性 型別特性

特性提供了關於宣告和型別的更多資訊。在swift中有兩類特性,用於修飾宣告的以及用於修飾型別的。例如,required特性,當應用於乙個類的指定或便利初始化器宣告時,表明它的每個子類都必須實現那個初始化器。再比如noreturn特性,當應用於函式或方法型別時,表明該函式或方法不會返回到它的呼叫者。通...

Swift4 0 新特性 Xcode9的優化

xcode 9 引入了 new build system,可在 xcode 9 的 file project settings.中選擇開啟。對於 swift 和 objective c 混合的專案,swift 呼叫 objective c 時,需要建立乙個 bridging headers 檔案,然...