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

警告說明:
- 指針缺少可空類型說明符
- 如指針指向的內(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_BEGIN和NS_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)載請注明出處。