iOS 9 關(guān)鍵字的簡(jiǎn)單使用

前言:

在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如下圖:

test1

test2
另外還有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ù)組中是什么類型如下圖:

在方法中使用泛型.png

在NSMutableArray中使用泛型.png

并且在上圖我們可以了解到, 在集合里規(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;
返回值使用id沒(méi)有提示.png
  • 所以蘋(píng)果出現(xiàn)了 instancetype 它會(huì)自動(dòng)識(shí)別當(dāng)前對(duì)象是哪個(gè)類, 只能在返回值中使用, 但是在調(diào)用方法時(shí)候還是不知道返回什么類型
- (instancetype)testStringArray:(NSArray *)stringArray;
instancetype在編譯能自動(dòng)識(shí)別類型.png
  • 最后蘋(píng)果推出了 __kindof 它在調(diào)用時(shí)候很清楚的知道返回的類型, 在我們之前很多地方需要強(qiáng)制類型轉(zhuǎn)換, 有了它就方便了很多
- (__kindof NSArray *)testStringArray:(NSArray *)stringArray;
__kindof使用.png

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

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

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

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