nonnull、泛型、__kindof

nil

不能为空

nonnull__nonnull
`@property (nonatomic,strong)NSArray *__nonnull ages;
@property (nonatomic,strong,nonnull) NSArray * ages;

可以为空

nullable__nonnullable
@property (nonatomic,strong)NSArray *__nullable ages;
@property (nonatomic,strong,nullable)NSArray * ages;`
- null_resettable

set可以为空,get不能为空

@property (null_resettable,nonatomic,strong)NSArray *ages;
需要重写set方法。例如:
-(void)setNums:(NSArray *)nums{
if (nums ==nil)return;
_nums = nums;
}

比如UIViewController的view属性,就是即使set为空,还是会懒加载一个view的值

范围内所有属性都为不能为空。

不过可以给范围内部分属性设为__nullable,该属性就变为可以为空了
NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END

泛型

声明数组、字典……里面只能装什么
@property (nonatomic,strong)NSArray <NSString *> *__nonnull names;
@property (nonatomic,strong)NSMutableDictionary <NSString *,NSNumber *> *dic;

一方面可以控制传值,另方面取出来的值可以直接用点语法,像是_names.lastObject.count
自定义泛型举例:
@interface XXBag<Type> : NSObject
-(void)add:(Type)objecg;
-(Type)get:(int)index;
@end

使用时
XXBag<XXBook *> *b1 = [[XXBagalloc]init];
[b1 add:<#(XXBook *)#>]
XXBag<XXCar *> *b2 = [[XXBag alloc]init];

比如系统中的NSMutableArray,@interface NSMutableArray<ObjectType> :NSArray<ObjectType>

协变性covariant

正常情况下
XXBag<NSString *> *b1 = [[XXBagalloc]init];
XXBag<NSMutableString *> *b2 = [[XXBagalloc]init];
b1 = (XXBag<NSString *> *)b2;

需要强转
如果添加了covariant
@interface XXBag<__covariant Type> :NSObject
-(void)add:(Type)objecg;
-(Type)get:(int)index;
@end

那么
b1 = (XXBag<NSString *> *)b2;
就可以直接b1 = b2;
结论:__covariant 小类型(泛型类的子类类型)->大类型(泛型类的 父类类型),可以不用添加强转
__contravariant 与__covariant相反 大类型(泛型类的 父类类型) -> 小类型(泛型类的子类类型)

__kindof

表示:可能是
作用:父类类型,可以用子类类型来接收
使用:在返回值的类型前面加上__kindof,既可以告知使用者返回参数可能是什么类型,又可以避免需要强转
-(__kindof NSArray * __nonnull)test2:(NSArray *__nonnull)ary{
return@[];
}
NSMutableArray *a = [selftest2:@[]];

其他

  • UIWindow
  • Storyboard Reference
  • UIStackView
  • Search API
  • 3D touch
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值