在iOS9.0 之后添加了一些新的关键字, 在这里复习一下, 顺便做个总结, 以便于让自己的代码更加规范。
常用关键字:
1. nonnull \ __nonnull :这个属性 代表setter 和 getter 都不能为nil
使用方法:
@property (nonatomic, strong, nonnull) NSArray *names;
@property (nonatomic, strong) NSArray * __nonnull names;
2. nullable \ __nullable :这个属性代表 setter 和 getter 都可以为nil
使用方法:
@property (nonatomic, strong, nullable) NSArray *names;
@property (nonatomic, strong) NSArray * __nullable names;
温馨提示:
默认情况下 属性不加nullable, setter 和 getter 也都是可以为nil,加上nullable 更多的作用在于程序员之间的沟通交流(提醒同事某个属性可能是nil)
3.null_resettable : setter可以为nil, getter不可以为nil
@property (null_resettable, nonatomic, strong) NSArray *names;
4.NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END之间的所有属性默认都是nonnull
泛型:
1. 常用的泛型 标明数组中装的东西, 便于使用
@property (nonatomic, strong) NSMutableArray<NSString *> *names;
@property (nonatomic, strong) NSMutableDictionary<NSString *, NSNumber *> *books;
2.自定义泛型
Bag<Book *> *bag1 = [[Bag alloc] init];
[bag1 get:0];
Bag<Car *> *bag2 = [[Bag alloc] init];
[bag2 get:0];
另外一个类写法:
@interface Bag<__contravariant ObjectType> : NSObject
- (void)add:(ObjectType)object;
- (ObjectType)get:(int)index;
@end
3.
__covariant : 小类型(泛型类的子类类型) -> 大类型(泛型类的父类类型) 时, 不会报⚠️
__contravariant : 大类型(泛型类的父类类型) -> 小类型(泛型类的子类类型)时, 不会报⚠️
__kindof
1. 一个方法中 返回参数中修饰符添加 __kindof
目的是:告诉编译器返回值可能是一个类(NSString),也可能是这个类的子类(NSMutableString)这样在调用时, 不用进行强制转换