有人可以詳細說明爲什麼在iOS 9中引入了nonnull
?目標C中什麼是非空?
例如,NSArray
方法+ (instancetype)array;
現在+ (instancetype nonnull)array;
這是一個Objective-C級別的功能,以及如何將這種影響現有的應用程序?
有人可以詳細說明爲什麼在iOS 9中引入了nonnull
?目標C中什麼是非空?
例如,NSArray
方法+ (instancetype)array;
現在+ (instancetype nonnull)array;
這是一個Objective-C級別的功能,以及如何將這種影響現有的應用程序?
他們已確保無論類型是不是空的,現在是一個nonnull
類型。
與早期NSMutableArray addObject
方法是
- (void)addObject:(ObjectType)anObject
,現在它已被更改爲
- (void)addObject:(ObjectType nonnull)anObject
因此,這意味着你不能傳遞一個空對象(nil
)這一方法。相同的方式,在你的情況下
+ (instancetype nonnull) array
方法將永遠不會返回nil
。
nonnull
是一個關鍵字,告訴編譯器返回值(或參數或屬性)永遠不會爲零。這是在先前版本的Xcode中引入的,以便在Obj-C和Swift的可選類型之間實現更好的互操作性。
您可以瞭解更多關於它的the official Swift blog
可空非空並已引入使目標C和斯威夫特互操作性更爲容易。
Objective C在可選和非可選引用之間沒有任何區別。那麼Swift編譯器無法確定對Objective C代碼的特定引用是否可選。
可爲空的註釋與Swift中的可選註釋相同。 非空註釋與Swift中的非可選註釋相同。
經驗法則是任何簡單的指針類型將被假定爲一個非空(詳情閱讀the official Swift blog)
我還要說,這種新的註釋也將改善但從目標C點代碼質量。我通常不知道應用程序崩潰,如果通過零參數?例如:
id var;
NSMutableArray *a = [NSMutableArray new];
[a addObject:var];
在這種情況下,編譯器不會說任何事情,並且您的應用程序將在執行時崩潰!現在有了這個新的註釋,您將在編譯時看到警告。我知道這個例子很愚蠢,但有些情況下,如果除非您閱讀文檔,否則在調用方法之前您是否需要檢查屬性是否爲零。
在你的例子中,我認爲重要的是要注意,由於NSMutableArray引發異常,應用程序只會崩潰。對象參數被註釋爲nonnull的事實不會導致應用程序崩潰,但有一個例外(不幸的是)。我傾向於在我的公共方法中驗證我的輸入爲零,並且拋出我自己的描述性例外,而不是稍後因爲難以診斷的原因而崩潰。 –
nonnull
是關鍵字,它通知編譯器由對象/參數返回的值永遠不會是nil
。
一般情況下,你應該看看可空非空和粗略的方式 您目前使用的斷言或例外:違反合同 編程錯誤。特別是,返回值是您控制的東西,因此除非爲了向後兼容,否則不應返回nil作爲不可爲空的返回類型 。
你的意思是「永遠不會*故意*爲零」。 –
它可能是零,但是無論如何,你的應用程序在DS中,並且超出希望。我想知道是否有人嘗試了將_do_賦給Swift對象引用的nil時發生了什麼。 – gnasher729
@ gnasher729 - 根據我在這裏看到的問題,人們經常嘗試。 –