iOS 關鍵字 及 泛型的使用 和 協變、逆變

關鍵字

1、nullable 和 nonnull

nullable:表示可以爲空
nonnull:表示非空

在屬性中的書寫規範:

// 方式1
@property (nonatomic, strong, nullable) NSString *name1;
@property (nonatomic, strong, nonnull) NSString *name1;

// 方式2
@property (nonatomic, strong) NSString * _Nullable name2;
@property (nonatomic, strong) NSString * _Nonnull name2;

// 方式3
@property (nonatomic, strong) NSString * __nullable name3;
@property (nonatomic, strong) NSString * __nonnull name3;

在方法中的書寫規範:

- (NSString * _Nullable)text:( NSString * _Nullable)str;
- (nonnull NSString *)text1:(nonnull NSString *)str;

需要注意的是,這兩個關鍵字只能修飾對象類型,不能修飾基本數據類型

系統還定義了兩個宏:NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END
在這兩個宏之間定義的所有對象屬性方法默認都是nonnull

2、null_resettable

null_resettable:get方法返回不能爲空,set方法參數可以爲空

用來修飾屬性,一旦使用,必須重寫該屬性的get方法或者set方法,處理傳遞值爲空的情況

在屬性中的書寫規範:

@property (strong, nonatomic, null_resettable) NSString *str;

3、null_unspecified

null_unspecified不確定是否爲空

在屬性中的書寫規範:

// 方式1
@property (strong, nonatomic) NSString * _Null_unspecified str;
// 方式2
@property (strong, nonatomic) NSString * __null_unspecified str;

泛型

泛型:用於限制類型,常用於數組,字典,集合中
職能修飾方法調用
好處:
1、減少程序員的交流
2、可以直接使用點語法

在屬性中的書寫規範:

@property (strong, nonatomic) NSMutableArray<NSString *> *arr;

自定義泛型

當聲明一個類,類中的某些屬性的類型不確定時,需要使用泛型。

用例子說明自定義泛型:

先創建一個語言類Language,再創建兩個基於Language的語言類,分別是 iOSJava 如:

Language類

#import <UIKit/UIKit.h>
@interface Language : NSObject
@end

iOS類

#import "Language.h"
@interface iOS : Language
@end

Java類

#import "Language.h"
@interface Java : Language
@end

創建Person類 如:

#import <Foundation/Foundation.h>
@interface Person<ObjectType> : NSObject
@property (nonatomic, strong)ObjectType language;
@end

只列出以上類的.h文件,.m文件沒有添加方法和屬性

在控制器的viewDidLoad 方法中:

- (void)viewDidLoad {
    [super viewDidLoad];
    Person<iOS *> *p1 = [[Person alloc] init];
    p1.language = [[iOS alloc] init];

    Person<Java *> *p2 = [[Person alloc] init];
    p2.language = [[Java alloc] init];
}

Person<iOS *> *p1 這樣寫,創建p1對象的language屬性就只能是iOS類的對象,同理,p2對象的language屬性就只能是Java類的對象。

協變,異變

__covariant 協變 用於 泛型 的數據類型強轉,可以向上強轉,子類 可以轉成 父類

例如:
修改Person.h,在ObjectType前添加__covariant

#import <Foundation/Foundation.h>
@interface Person<__covariant ObjectType> : NSObject
@property (nonatomic, strong)ObjectType language;
@end

在控制器的viewDidLoad 方法中:

- (void)viewDidLoad {
    [super viewDidLoad];
    Person<Language *> *p = [[Person alloc] init];
    Person<iOS *> *iOSP = [[Person alloc] init];
    p.language = [[iOS alloc] init];

    // 如果子類想給父類賦值,用到協變
    p = iOSP;
}
__contravariant:逆變 用於 泛型 的數據類型強轉,可以向下強轉,父類 可以轉成 子類

例如:
修改Person.h,在ObjectType前添加__contravariant

#import <Foundation/Foundation.h>
@interface Person<__contravariant ObjectType> : NSObject
@property (nonatomic, strong)ObjectType language;
@end

在控制器的viewDidLoad 方法中:

- (void)viewDidLoad {
    [super viewDidLoad];

    Person<Language *> *p = [[Person alloc] init];
    p.language = [[Java alloc] init];
    Person<iOS *> *iOSP = [[Person alloc] init];
    p.language = [[iOS alloc] init];

    // 如果父類想給子類賦值,用到逆變
    iOSP = p;

}

轉載請註明出處,萬分感謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章