标签:
//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:暂时就是一些简单应用
标签:
原文地址:http://www.cnblogs.com/czc-wjm/p/5648277.html