title: 淺析nonnull和nullable
date: 2016-11-17 14:59:50
categories:
- iOS_SHAKALAKA
tags: - iOS
- nonnull
- nullable
淺析nonnull和nullable
為了對應(yīng)Swift中的optional和non-optional,Xcode6.3推出了一個新特性,就是 nullable 和 nonnull
簡單來講,nullable 表示對象可以是NULL或nil,nonnull 表示對象不可以為空,當(dāng)我們不遵循上述規(guī)則時,編譯器就會警告。
下面簡單示范一下這兩個東西的用法!
聲明屬性有兩種寫法。
第一種寫法
@property (nonatomic, copy, nullalbe) NSString *name;
@property (nonatomic, strong, nonnull) UITableView *tableView;
第二種寫法
@property (nonatomic, copy) NSString * __nullabel name;
@property (nonatomic, strong) UITableView * __nonnull tableView;
個人推薦第一種寫法,簡單清晰明了。
聲明方法的參數(shù)也有兩種寫法
第一種寫法:
- (instancetype)initWithName:(nonnull NSString *)name;
- (instancetype)initWithName:(nullable NSString *)name;
第二種寫法:
- (instancetype)initWithName:(_Nonnull NSString *)name;
- (instancetype)initWithName:(_Nullable NSString *)name;
當(dāng)然,試想一下如果每一個參數(shù)都需要指定 _nullable 或者 _nonnull,未免不是太麻煩了么!好在蘋果給我們提供了一對宏定義: NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END
基本用法如下:
NS_ASSUME_NONNULL_BEGIN
@interface DemoVC_1 : UIViewController
//需要指定 nullable
@property (nonatomic, copy, nullable) NSString *name;
//NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END 之間,此處 ID 沒有指定則默認(rèn)為 nonnull
- (instancetype)initWithID:(NSString *)ID;
@end
NS_ASSUME_NONNULL_END
總結(jié)
其實(shí)很早以前就看見別人用這兩個小玩意了,因?yàn)閼芯蜎]去仔細(xì)研究,導(dǎo)致一直沒弄明白,今天又看見了,一臉尷尬。。優(yōu)秀的開發(fā)者總是時刻追隨技術(shù)最前沿,擁抱變化,接收新鮮事物,希望自己在以后的開發(fā)中能夠親身踐行,加油!
博主原創(chuàng),轉(zhuǎn)載請注明出處,不勝感激