
前言:
在iOS 9 蘋(píng)果推出了很多關(guān)鍵字, 目的其實(shí)很明確, 主要就是提高開(kāi)發(fā)人員的效率, 有益于程序員之間的溝通與交流, 在開(kāi)發(fā)中代碼更加規(guī)范!
**1. nullable 與 nonnull **
nullable : 表示可以為 nil
nonnull : 表示不可以為 nil
這兩個(gè)關(guān)鍵字只能修飾對(duì)象, 不能修飾基本數(shù)據(jù)類型, 可以用在屬性, 方法的參數(shù), 方法的返回值使用, 在默認(rèn)情況下, 不加nullable, setter 和 getter 都是可以為nil
我們來(lái)看下如何使用, 以nullable為例如下:
@property (nonatomic, strong, nullable) NSArray *array;
@property (nonatomic, strong) NSArray * __nullable array;
@property (nonatomic, strong) NSArray * _Nullable array;
在方法中怎么使用呢? 我們來(lái)看看:
- (nonnull NSString *)testString:(nonnull NSString *)string;
- (NSString * _Nonnull)testString:(NSString * _Nonnull)string;
- (NSString * __nonnull)testString:(NSString * __nonnull)string;
我們?cè)谡{(diào)用屬性或者方法時(shí)候, 系統(tǒng)會(huì)提示你當(dāng)前的對(duì)象是否為nil如下圖:


另外還有2個(gè)宏如下:
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
在這兩個(gè)宏之間的所有對(duì)象屬性默認(rèn)都是nonnull
關(guān)鍵字: null_resettable
getter :不可以為nil
setter :可以為nil
如果使用 null_resettable 就必須重寫(xiě) getter或者setter方法. 目的是為了處理值為空的情況
使用方法如下:
@property (nonatomic, strong, null_resettable) UIView *testView;
關(guān)鍵字: _Null_unspecified
不確定是否為空, 此關(guān)鍵字個(gè)人感覺(jué)意義不是很大, 因?yàn)閷?duì)象屬性默認(rèn)就是不確定的
使用方法如下:
@property (nonatomic, strong) UIView * _Null_unspecified testView;
@property (nonatomic, strong) UIView * __null_unspecified testView;
**2. 泛型 **
通過(guò)使用泛型, 我們可以非常容易地獲取其中的元素,并訪問(wèn)其特有的屬性和方法, 一般使用在集合中使用(例如:數(shù)組,字典), 當(dāng)方法調(diào)用的時(shí)候才有效果, 我們來(lái)看看如何使用:
//屬性使用
@property (nonatomic, strong) NSMutableArray<NSString *> *testArrayM;
//在方法中使用
- (NSArray<NSString *> *)testStringArray:(NSArray<NSString *> *)stringArray;
我們?cè)跀?shù)組中使用泛型, 之后我們可以很明確知道數(shù)組中是什么類型如下圖:


并且在上圖我們可以了解到, 在集合里規(guī)定對(duì)象的類型, 通過(guò)集合取出來(lái)的對(duì)象可以當(dāng)做泛型來(lái)使用, 并且可以直接用點(diǎn)語(yǔ)法, 可想而知泛型的好處是非常強(qiáng)大的!
協(xié)變/逆變
- __covariant: 協(xié)變, 用于數(shù)據(jù)強(qiáng)制轉(zhuǎn)換類型(子類可以轉(zhuǎn)變父類)
- __contravariant :逆變, 用于數(shù)據(jù)強(qiáng)制轉(zhuǎn)換類型(父類可以轉(zhuǎn)變子類)
**3. __kindof **
表示當(dāng)前類, 或者它的子類(__kindof使用: 放在類型前面, 表示修飾此類型)
我們先從 id 開(kāi)始說(shuō)起
- 最開(kāi)始我們方法的返回值不確定,我們會(huì)使用 id 但是使用它會(huì)有不好之處, id在編譯的時(shí)候不能檢查真實(shí)類型, 并且返回值沒(méi)有提示
- (id)testStringArray:(NSArray *)stringArray;

- 所以蘋(píng)果出現(xiàn)了 instancetype 它會(huì)自動(dòng)識(shí)別當(dāng)前對(duì)象是哪個(gè)類, 只能在返回值中使用, 但是在調(diào)用方法時(shí)候還是不知道返回什么類型
- (instancetype)testStringArray:(NSArray *)stringArray;

- 最后蘋(píng)果推出了 __kindof 它在調(diào)用時(shí)候很清楚的知道返回的類型, 在我們之前很多地方需要強(qiáng)制類型轉(zhuǎn)換, 有了它就方便了很多
- (__kindof NSArray *)testStringArray:(NSArray *)stringArray;

覺(jué)得能幫助你的小伙伴點(diǎn)贊一個(gè),歡迎留言交流提出不足之處!