iOS開發(fā) - NS_ASSUME_NONNULL_BEGIN & NS_ASSUME_NONNULL_END

<article class="_2rhmJa">

XCode6.3之后,當我們創(chuàng)建一個新的類時,系統(tǒng)會默認在@interface上方和@end下方添加兩個宏NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END,先看看手動去掉這兩個宏會出現(xiàn)什么問題:

image

警告說明:

  • 指針缺少可空類型說明符
  • 如指針指向的內(nèi)容可空則插入_Nullable說明符
  • 如指針指向的內(nèi)容不可為空則插入_Nonnull說明符

再來看看警告原因:
我們都知道,swift作為iOS開發(fā)的一種新語言,脫胎于OC卻更集于多種編程語言的優(yōu)點,相較于OC,其更簡潔、安全。swift作為一個強類型匹配的語言,對與變量的賦值不再如OC般模糊。

  • 在OC開發(fā)中,如果一個變量暫時不使用,可以賦值為0(基本屬性類型)或者賦值為空(對象類型)
  • 在swift開發(fā)中,nil也是一個特殊的類型,因為和真實的類型不匹配不能直接賦值

在swift中有一個新的類型-可選類型,開發(fā)者可以通過!或 ? 來標明一個對象是否可選(optional 、non-optional),對于可選類型,可以先賦值為nil,等需要使用的時候再進行賦值:

// 定義可選類型
var string : Optional<String> = nil
//可選類型賦值
string = "Hello world"

而在OC中則沒有這種區(qū)分,一個對象既可以表示為可選,也可表示為不可選類型。于是OC、swift混編時就會出現(xiàn)OC中的對象類型在swift中無法確定的問題,因此系統(tǒng)會默認將OC中的對象全作為不可選類型。在XCode6.3之后,為OC也添加了這一控制屬性<"屬性"可能不太恰當> nullabel(可空-可選)、nonnull(不可為空-不可選)。

弄清楚具體原因之后,我們就可以著手解決問題了。對于上面出現(xiàn)的warning,有以下三種解決方式:

  • 1.系統(tǒng)提示方法:(點擊fix系統(tǒng)自動添加)
@interface testLabel : UILabel
@property (nonatomic, strong) NSString * _Nullable troubleString;
@end

  • 2.手動添加nullabel、nonnull修飾屬性
@interface testLabel : UILabel
@property (nonatomic, strong ) NSString * _Nullable testString1;
@property (nonatomic, strong , nonnull) NSString *testString2;
@end

  • 3.使用引出該問題的宏NS_ASSUME_NONNULL_BEGINNS_ASSUME_NONNULL_END

在這兩個宏之間的代碼,所有簡單指針對象都被假定為nonnull,因此我們只需要去指定那些nullable的指針。

NS_ASSUME_NONNULL_BEGIN
@interface testLabel : UILabel
@property (nonatomic, strong) NSString *testString3;
@end
NS_ASSUME_NONNULL_END

作者:歸客居
鏈接:http://www.itdecent.cn/p/4f96d54b3902
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容