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