关闭

iOS9新增关键字和一些新特性的学习

标签: iOS9新增关键字泛型__kindof__covariantiOS9新特性
231人阅读 评论(0) 收藏 举报
分类:

iOS9新增关键字和一些新特性的学习

一、先谈谈iOS9中新增的几个关键字的学习

nullable:  表示该属性的值可以为nil

// 写法一
@property (nonatomic, strong, nullable) NSString * name;
// 写法二
@property (nonatomic, strong) NSString * _Nullable name;

nonnull:表示该属性的值不可以为空

// 写法一
@property (nonatomic, strong, nonnull) NSString * name;
// 写法二
@property (nonatomic, strong) NSString * _Nonnull name;

如果给name赋值nil或者NULL,编译器会报一个警告

Null passed to a callee that requires a non-null argument

null_resettable: 表示该属性的get方法返回值不能为空

如果属性赋值为空,会报如下警告

Synthesized setter 'setName:' for null_resettable property 'name' does not handle nil

解决方法:重写该属性的set或者get方法,处理nil的情况

null_unspecified: 表示不确定该属性的值是否为空

// 写法一
@property (nonatomic, strong, null_unspecified) NSString * name;
// 写法二
@property (nonatomic, strong) NSString * _Null_unspecified name;

两个宏定义的介绍,这两个宏是从UIButton.h定义文件中找出来的,分别该文件中的开头和结尾,这两个宏定义的意思表示:在这两者之间定义的属性和方法默认是nonnull类型的,也就是不可以赋值为nil或者NULL

#define NS_ASSUME_NONNULL_BEGIN _Pragma("clang assume_nonnull begin")

#define NS_ASSUME_NONNULL_END   _Pragma("clang assume_nonnull end")

二、泛型简单介绍

@interface NSArray<ObjectType> (NSExtendedArray)

- (NSArray<ObjectType> *)arrayByAddingObject:(ObjectType)anObject;
- (NSArray<ObjectType> *)arrayByAddingObjectsFromArray:(NSArray<ObjectType> *)otherArray;
上面这几行代码是在NSArray中的定义中截取出来的,很明显ObjectType就是NSArray支持的泛型类型,so,自己需要用到泛型的时候就可以这样定义了
@interface Animal<ObjectType> : NSObject
//...属性...方法
@end

__covariant和__contravariant的介绍

__covariant 表示:子类给父类赋值,即子类强转为父类的类型

__contravariant 表示:父类给子类赋值,即父类强转为子类的类型

举个栗子:现目前有三个类,Animal、Dog、Cat,Animal是Dog和Cat的父类

这是Animal的定义

@interface Animal<ObjectType> : NSObject

@end
Animal<Animal *> * mal = [[Animal alloc] init];
Animal<Dog *> * dog = [[Animal alloc] init];
// 子类给父类赋值
mal = dog;
当编译这段代码的时候系统会给出这样一个警告:
Incompatible pointer types assigning to 'Animal<Animal *> *' from 'Animal<Dog *> *'
这时候要解决警告,就用用到__covariant了

Animal的定义改为

@interface Animal<__covariant ObjectType> : NSObject

@end
同理:如果是dog = mal;

Animal的定义改为

@interface Animal<__contravariant ObjectType> : NSObject

@end
三、__kindof的介绍

- (__kindof UICollectionViewCell *)dequeueReusableCellWithReuseIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;
- (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString *)elementKind withReuseIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath;
这两个方法是UICollectionView里面截取的方法,好处如下:
    __kindof:表示当前类或者它子类
    __kindof书写格式:
    放在类型前面,表示修饰这个类型(__kindof  ClassName *)
    __kindof  :在调用的时候,很清楚的知道返回类型

















0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:81313次
    • 积分:1442
    • 等级:
    • 排名:千里之外
    • 原创:61篇
    • 转载:4篇
    • 译文:1篇
    • 评论:19条
    最新评论