iOS9新出的關鍵字,用來修飾屬性,或者方法的參數,方法的返回值
好處:
- 迎合swift
- 提高我們開發人員開發規范,減少程序員之間的交流
nullable和nonnull
nullable
:表示可以為空,nonnull
為非空
只能修飾對象,不能修飾int等,因為nil只能賦值給對象
書寫規范一樣,以nullable
為例:
- 方式一:
@property (nonatomic, strong, nullable) NSString *name;
- 方式二:
@property (nonatomic, strong) NSString *_Nullable name;
- 方式三:
@property (nonatomic, strong) NSString *__nullable name;
- 方式四:修飾方法
- (nonnull NSString *)name:(nonnull NSString *)str;
- (NSString *_Nonnull)name;
- 方式五:
在NS_ASSUME_NONNULL_BEGIN
和NS_ASSUME_NONNULL_END
之間定義的所有對象屬性和方法默認都是nonnull
。
NS_ASSUME_NONNULL_BEGIN
@property (nonatomic, strong) NSString *name;
NS_ASSUME_NONNULL_END
null_resettable
// null_resettable:get不能返回空,set可以為空(比如控制器的view)
@property (nonatomic, copy, null_resettable) NSString *name;
null_resettable
必須重寫setter
或者getter
方法,處理傳遞的值為空的情況(實際重寫不判斷為空警告也沒了),不然會有警告。
null_unspecified
null_unspecified
不確定是否為空
@property (nonatomic, strong) NSString *_Null_unspecified name;
@property (nonatomic, strong, null_unspecified) NSString *name;
泛型
泛型:限制類型
泛型使用場景:
- 在集合(數組、字典、
NSSet
)中使用泛型比較常見。 - 當聲明一個類。類里面的某些屬性的類型不確定,這時候我們才使用泛型。
泛型好處:
- 提高開發規范,減少程序員之間交流
- 通過集合取出來對象,直接當做泛型對象使用,可以直接使用點語法
@property (nonatomic, strong) NSArray<NSString *> *nameArr;
// 后面使用時可以直接調出對應的方法
self.nameArr[0].length;
// ObjectType可以自己指定名字
@interface Person<ObjectType> : NSObject
@property (nonatomic) ObjectType language;
- (ObjectType)language;
@end
Person<NSString *> *p = [Person new];
p.language = @"ss";
__covariant
(協變): 用于泛型數據強轉類型,可以向上強轉,子類可以轉成父類。
@interface Person<__covariant ObjectType> : NSObject
@property (nonatomic) ObjectType language;
- (ObjectType)language;
@end
__contravariant
(逆變): 用于泛型數據強轉類型,可以向下強轉,父類可以轉成子類。
@interface Person<__contravariant ObjectType> : NSObject
@end
__kindof
__kindof
表示當前類或者它的子類
好處:
- 可以在編譯的時候,檢查真實類型
- 返回值會有提示修飾的當前類
@property (nonatomic, strong) NSArray<__kindof NSString *> *nameArr;
- (__kindof NSString *)test;