前言:
在iOS 9 蘋果推出了很多關鍵字, 目的其實很明確, 主要就是提高開發人員的效率, 有益於程式設計師之間的溝通與交流, 在開發中程式碼更加規範!
1. nullable 與 nonnull
nullable : 表示可以為 nil
nonnull : 表示不可以為 nil
這兩個關鍵字只能修飾物件, 不能修飾基本資料型別, 可以用在屬性, 方法的引數, 方法的返回值使用, 在預設情況下, 不加nullable, setter 和 getter 都是可以為nil
我們來看下如何使用, 以nullable為例如下:
1 2 3 |
@property (nonatomic, strong, nullable) NSArray *array; @property (nonatomic, strong) NSArray * __nullable array; @property (nonatomic, strong) NSArray * _Nullable array; |
在方法中怎麼使用呢? 我們來看看:
1 2 3 |
- (nonnull NSString *)testString:(nonnull NSString *)string; - (NSString * _Nonnull)testString:(NSString * _Nonnull)string; - (NSString * __nonnull)testString:(NSString * __nonnull)string; |
我們在呼叫屬性或者方法時候, 系統會提示你當前的物件是否為nil如下圖:
另外還有2個巨集如下:
1 2 |
NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END |
在這兩個巨集之間的所有物件屬性預設都是nonnull
關鍵字: null_resettable
getter :不可以為nil
setter :可以為nil
如果使用 null_resettable 就必須重寫 getter或者setter方法. 目的是為了處理值為空的情況
使用方法如下:
1 |
@property (nonatomic, strong, null_resettable) UIView *testView; |
關鍵字: _Null_unspecified
不確定是否為空, 此關鍵字個人感覺意義不是很大, 因為物件屬性預設就是不確定的
使用方法如下:
1 2 |
@property (nonatomic, strong) UIView * _Null_unspecified testView; @property (nonatomic, strong) UIView * __null_unspecified testView; |
2. 泛型
通過使用泛型, 我們可以非常容易地獲取其中的元素,並訪問其特有的屬性和方法, 一般使用在集合中使用(例如:陣列,字典), 當方法呼叫的時候才有效果, 我們來看看如何使用:
1 2 3 4 |
//屬性使用 @property (nonatomic, strong) NSMutableArray *testArrayM; //在方法中使用 - (NSArray *)testStringArray:(NSArray *)stringArray; |
我們在陣列中使用泛型, 之後我們可以很明確知道陣列中是什麼型別如下圖:
並且在上圖我們可以瞭解到, 在集合裡規定物件的型別, 通過集合取出來的物件可以當做泛型來使用, 並且可以直接用點語法, 可想而知泛型的好處是非常強大的!
協變/逆變
- __covariant: 協變, 用於資料強制轉換型別(子類可以轉變父類)
- __contravariant :逆變, 用於資料強制轉換型別(父類可以轉變子類)
3. __kindof
表示當前類, 或者它的子類(__kindof使用: 放在型別前面, 表示修飾此型別)
我們先從 id 開始說起
- 最開始我們方法的返回值不確定,我們會使用 id 但是使用它會有不好之處, id在編譯的時候不能檢查真實型別, 並且返回值沒有提示
1 |
- (id)testStringArray:(NSArray *)stringArray; |
- 所以蘋果出現了 instancetype 它會自動識別當前物件是哪個類, 只能在返回值中使用, 但是在呼叫方法時候還是不知道返回什麼型別
1 |
- (instancetype)testStringArray:(NSArray *)stringArray; |
- 最後蘋果推出了 __kindof 它在呼叫時候很清楚的知道返回的型別, 在我們之前很多地方需要強制型別轉換, 有了它就方便了很多
1 |
- (__kindof NSArray *)testStringArray:(NSArray *)stringArray; |
覺得能幫助你的小夥伴點贊一個,歡迎留言交流提出不足之處!