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;