2015-06-23 123 views

回答

16

他們已確保無論類型是不是空的,現在是一個nonnull類型。

與早期NSMutableArray addObject方法是

- (void)addObject:(ObjectType)anObject 

,現在它已被更改爲

- (void)addObject:(ObjectType nonnull)anObject 

因此,這意味着你不能傳遞一個空對象(nil)這一方法。相同的方式,在你的情況下

+ (instancetype nonnull) array 

方法將永遠不會返回nil

參考:https://developer.apple.com/swift/blog/?id=25

9

nonnull是一個關鍵字,告訴編譯器返回值(或參數或屬性)永遠不會爲零。這是在先前版本的Xcode中引入的,以便在Obj-C和Swift的可選類型之間實現更好的互操作性。

您可以瞭解更多關於它的the official Swift blog

+6

你的意思是「永遠不會*故意*爲零」。 –

+1

它可能是零,但是無論如何,你的應用程序在DS中,並且超出希望。我想知道是否有人嘗試了將_do_賦給Swift對象引用的nil時發生了什麼。 – gnasher729

+2

@ gnasher729 - 根據我在這裏看到的問題,人們經常嘗試。 –

0

可空非空並已引入使目標C和斯威夫特互操作性更爲容易。

Objective C在可選和非可選引用之間沒有任何區別。那麼Swift編譯器無法確定對Objective C代碼的特定引用是否可選。

可爲空的註釋與Swift中的可選註釋相同。 非空註釋與Swift中的非可選註釋相同。

經驗法則是任何簡單的指針類型將被假定爲一個非空(詳情閱讀the official Swift blog

我還要說,這種新的註釋也將改善但從目標C點代碼質量。我通常不知道應用程序崩潰,如果通過零參數?例如:

id var; 
NSMutableArray *a = [NSMutableArray new]; 
[a addObject:var]; 

在這種情況下,編譯器不會說任何事情,並且您的應用程序將在執行時崩潰!現在有了這個新的註釋,您將在編譯時看到警告。我知道這個例子很愚蠢,但有些情況下,如果除非您閱讀文檔,否則在調用方法之前您是否需要檢查屬性是否爲零。

+1

在你的例子中,我認爲重要的是要注意,由於NSMutableArray引發異常,應用程序只會崩潰。對象參數被註釋爲nonnull的事實不會導致應用程序崩潰,但有一個例外(不幸的是)。我傾向於在我的公共方法中驗證我的輸入爲零,並且拋出我自己的描述性例外,而不是稍後因爲難以診斷的原因而崩潰。 –

3

nonnull是關鍵字,它通知編譯器由對象/參數返回的值永遠不會是nil

一般情況下,你應該看看可空非空和粗略的方式 您目前使用的斷言或例外:違反合同 編程錯誤。特別是,返回值是您控制的東西,因此除非爲了向後兼容,否則不應返回nil作爲不可爲空的返回類型 。