关键字
iOS9新出的关键字主要有:
nullable,nonnull,null_resettable,null_unspecified.用来修饰属性,或者方法的参数,方法的返回值 ,只能用来修饰对象,不能修饰基本数据类型;
属性中关键字的书写:
//nullable表示可以为空;nonnull表示不可以为空;
/*
null_resettable:get方法返回不能为空,set方法可以为空;
如果使用该关键字修饰属性,需要重写get方法或者set方法,处理传递的值为空的情况;
null_unspecified表示不确定是否为空
*/
//第一种写法
@property (nonatomic, strong, nullable) NSString *name;
//第二种写法
@property (nonatomic, strong) NSString *_Nullable name;
//第三种写法
@property (nonatomic, strong) NSString *__nullable name;
注意:
在宏 NS_ASSUME_NONNULL_BEGIN 和 NS_ASSUME_NONNULL_END之间定义的所有对象属性和方法默认都是nonnull
null_resettable只有第一种写法;其它几个关键字的书写方式都是一样的;
方法中关键字的书写:
- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;
- (NSString * _nullable)test:(NSString * _nullable)string;
- (nullable NSString *)test:(nullable NSString *)string;
关键字的作用:
1.与 swift 对接;
2.提高开发人员的开发规范,减少沟通成本;
泛型使用场景及用法:
1.主要在集合(数组,字典,NSSet)中比较常见;
2.当声明一个类,类里面的某些属性的类型不确定的时候,此时我们才使用泛型.
3.通过集合取出来对象,直接当做泛型对象使用,可以直接使用点语法;通过泛型可以显示集合类型;
书写规范:
@property (strong, nonatomic) NSMutableArray <NSString *> *array;
//array数组当中只能存放NSString类型的对象.如果向array中添加非NSString类型的对象,编译器回报警告.只能修饰方法的调用;
泛型的协变和逆变
__covariant(协变):用于泛型数据强转类型,可以向上强转,子类可以转成父类;
__contravariant(逆变):用于泛型数据强转类型,可以向下强转, 父类可以转成子类;
__kindof
__kindof:表示当前类或者它子类;
kindof书写格式: 放在类型前面,表示修饰这个类型,例如:(kindof Person *);
__kindof :在调用的时候,很清楚的知道返回类型;
id :
1.不能编译的时候检查类的真实类型;
2.返回值没有提示;
instancetype:
1.可以自动的检测类的真实类型;
书写规范:
- (nullable __kindof UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier;
UIStackView
在iOS9中苹果在UIKit框架中引入了一个新的视图类UIStackView。UIStackView类可以帮我们布局UI控件,而我们不需要设置任何约束或设置很少的约束就可以,其他都由UIStackView帮我们自动完成了。
UIStackView 是 UIView 的子类,是用来约束子控件的一个控件。但他的作用仅限于此,他不能用来呈现自身的内容,类似于 backgroundColor。当然了,这个控件相当易学,属性只有4个。分别为:
Axls: 子控件的布局方向,水平或者垂直
Alignment: 对齐方式
Distributlon: 根据内部子视图尺寸对子视图尺寸进行动态调整
Spacing: 子控件间的间距
在Interface Builder中使用UIStackView就类似于使用一个UI控件一样,通过让将其他视图成为UIStackView的子视图来进行布的,UIStackView也可以嵌套多个UIStackView。
值得注意的是,UIStackView虽然继承自UIView,但是并不参与屏幕的渲染,重写drawRect:方法也是无效的。
可以看到在属性左边有个加号,点开来是这样的:
这其实是 UIStackView 也集成了 Size Class,Size Class 是用来布局不同尺寸屏幕的。在这里可以通过选择不同的尺寸来更新子控件约束。
UIStackView使用arrangedSubviews数组来管理子视图。需要注意的是这个数组是一个readonly的属性,我们需要调用方法对arrangedSubviews数组进行操作。
//初始化数组:
- (instancetype)initWithArrangedSubviews:(NSArray<__kindof UIView *> *)views;
//添加子视图:
- (void)addArrangedSubview:(UIView *)view;
//移除子视图:
- (void)removeArrangedSubview:(UIView *)view;
//根据下标插入视图:
- (void)insertArrangedSubview:(UIView *)view atIndex:(NSUInteger)stackIndex;
其它UIStackView的约束设置和其它控件的操作都是一样的;