標籤:
//1、聲明屬性可以為空白的三種寫法:
1、@property (nonatomic, copy, nullable)NSString *name;2、@property (nonatomic, copy)NSString *_Nullable name1;3、@property (nonatomic, copy)NSString *__nullable name2;
//2、聲明屬性可以為空白的三種寫法:
1、@property (nonatomic, copy, nonnull)NSString *name4;2、@property (nonatomic, copy)NSString *_Nonnull name5;3、@property (nonatomic, copy)NSString *__nonnull name6;
註: 以上三種寫法第一種寫法用的最多,後兩種基本不怎麼用
//3、在NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END之間,定義的所有對象屬性和方法預設都是nonnull
NS_ASSUME_NONNULL_BEGIN @property (nonatomic, copy, nullable)NSString *name; @property (nonatomic, copy)NSString *_Nullable name1; @property (nonatomic, copy)NSString *__nullable name2;NS_ASSUME_NONNULL_END
//4、在方法中的用法如下:
- (nonnull NSString *)test:(nullable NSString *)str;- (NSString * _Nonnull)test1:(NSString * _Nonnull)str;
5、null_resettable的使用:
null_resettable: get:不能返回為空白, set可以為空白
如果使用null_resettable,必須重寫get方法或者set方法,處理傳遞的值為空白的情況如下(setter或getter實現其一即可)
@property (nonatomic, copy, null_resettable)NSString *name;//實現setter方法- (void)setName:(NSString *)name{ if (name == nil) { name = @"123"; } _name = name;}//實現getter- (NSString *)name{ if (_name == nil) { _name = @"123"; } return _name;}
6、聲明數組中對象的類型:在類型後面增加<資料類型 *>,之後如果資料中插入非字串類型會出現警告、崩潰
@property (nonatomic, strong)NSMutableArray<NSString *> *dataArray;
7、__kindof使用:__kindof:表示當前類或者它子類,
__kindof書寫格式:放在類型前面,表示修飾這個類型(__kindof Person *),
__kindof :在調用的時候,很清楚的知道傳回型別。
註:當然也可以寫+ (instancetype)person;傳回值是instancetype就好了,
舉例:建立一個Person類
//.h中@interface Person : NSObject+ (__kindof Person *)person;+ (Person *)person1;@end//.m中@implementation Person//表示返回資料類型是person或其子類對象+ (__kindof Person *)person{ return [[self alloc] init];}+ (Person *)person1{ return [[self alloc] init];}@end//建立Person子類SonPerson@interface SonPerson : Person @end//此時SonPerson調用父類方法+ (__kindof Person *)person則返回SonPerson對象//正常返回 SonPerson *son = [SonPerson person];//返回的對象是Person對象SonPerson *son1 = [SonPerson person1];
8、__covariant(協變),__contravariant(逆變)__covariant(協變):用於泛型資料強轉類型,可以向上強轉,子類 可以轉成 父類__contravariant(逆變):用於泛型資料強轉類型,可以向下強轉, 父類 可以 轉成子類執行個體:建立Language類,同時建立IOS、JAVA兩個類繼承自Language,在建立Person類,其中Person類代碼:
#import <Foundation/Foundation.h>#import "Language.h"#import "IOS.h"//聲明泛型@interface Person<__contravariant ObjectType> : NSObject//語言@property (nonatomic) ObjectType language; //id:任何對象都能傳進來 //Language:在外面調用的時候,沒有提示 //IOS* 以後只能傳對象- (ObjectType)language;- (void)setLanguage:(ObjectType)language; @end //controller中 Person<Language *> *p = [[Person alloc] init]; Person<IOS *> *iosP = [[Person alloc] init]; // 如果子類想給父類賦值,協變 iosP = p; // 泛型沒有確定,就是id類型 iosP.language = [[IOS alloc] init];
ps:暫時就是一些簡單應用
iOS新特性