關鍵字
- iOS9新出的關鍵字:用來修飾屬性,或者方法的參數,方法的返回值
-
好處:
- 迎合swift
- 提高我們開發人員開發規範,減少程序員之間交流
-
注意: iOS9新出關鍵字nonnull,nullable,null_resettable,_Null_unspecified只能
修飾對象,不能修飾基本數據類型
/**
1. 首字母不帶下滑線的修飾類名(eg. nullable)
2. 首字母帶一個下劃線,則首字母大寫,修飾對象(eg. _Nullable)
3. 首字母帶兩個下劃線,則首字母小寫,修飾對象(eg. __nullable)
4. 大多數一般只有第一種
*/
nullable書寫規範:
// 方式一:
@property (nonatomic, strong, nullable) NSString *name;
// 方式二:
@property (nonatomic, strong) NSString *_Nullable name;
// 方式三:
@property (nonatomic, strong) NSString *__nullable name;
nonnull: non:非 null:空
書寫格式:
@property (nonatomic, strong, nonnull) NSString *icon;
@property (nonatomic, strong) NSString * _Nonnull icon;
@property (nonatomic, strong) NSString * __nonnull icon;
在NS_ASSUME_NONNULL_BEGIN
和NS_ASSUME_NONNULL_END
之間,定義的所有對象屬性和方法默認都是nonnull
null_resettable
作用: get:不能返回爲空, set可以爲空
// 書寫方式:
@property (nonatomic, strong, null_resettable) NSString *name;
// 注意;如果使用null_resettable,必須 重寫get方法或者set方法,處理傳遞的值爲空的情況
// 書寫方式只有這種
// 方式一
@property (nonatomic, strong) NSString *_Null_unspecified name;
// 方式二
@property (nonatomic, strong) NSString *__null_unspecified name;
泛型(限制類型)
使用場景
- 限制集合中的類型(數組、字典、NSSet)
注意:只能檢測方法的調用,因爲聲明的泛型,只能放在方法中 - 當一個類在聲明的時候,某個對象的屬性不確定,只有創建對象的時候才確定,可以使用泛型
好處
- 提高開發規範,減少程序員之間交流
- 通過集合取出來對象,直接當做泛型對象使用,可以直接使用點語法
書寫格式
放在類型後面,表示限制這個類型。
@property (nonatomic, strong) NSMutableArray<NSString *> *datas;
自定義泛型:模仿數組
- 需求:假設有個Person,這個人會編程語言,但是在定義的時候不確定,只有在創建對象的時候才確定。
- language屬性的類型就有講究了
- id 類型:表示可以傳任何對象
- Launguage類型,在賦值的時候沒有提示
- 泛型,聲明泛型,在創建對象的時候,確定泛型,在賦值就有提示了。
@interface Person<ObjectType> : NSObject {
// 語言
@property (nonatomic) ObjectType language;
}
協變,逆變
作用:用於轉換類型
- 默認帶有泛型的變量,互相賦值有報警告,使用協變,逆變,就能解決.
- 協變(__covariant): 向上轉型, 子類轉父類
- 逆變(__contravariant):向下轉型 父類轉子類
__kindof
id壞處
- 不能在編譯的時候檢查真實類型
- 返回值,沒有提示
- 可以調用任何方法,編譯時不報錯
instancetype
- 會自動識別當前對象的類,返回當前調用類的對象
+ (instancetype)person;
__kindof :
在調用的時候,很清楚的知道返回類型(類似於instancetype,但instancetype只能用於初始化中)
作用:
1. 將此類型指定爲class_name或class_name的子類,告訴編譯器這兩者均能適配。
2. Objective-C是動態類型,編譯器會在編譯時做類型匹配,不會有編譯警告,更不會報錯。
場景:
1. 泛型
2. 方法返回值
//
- (nullable __kindof UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath; visible or index path is out of range;
// returns nil if cell is not
@property (nonatomic, readonly) NSArray<__kindof UITableViewCell *> *visibleCells;