1.关键字
- 关键字:可以用于属性,方法返回值和参数中
- 关键字的作用:提示作用,告诉开发者属性信息
- 关键字好处:提高代码规范,减少沟通成本
- 关键字仅仅提供警告,不会报编译错误。因为oc是弱语法,swift是强语法,语法要求很严格。
nullable
- nullabel 字面意思:可能为空
- 如下的写法:
// 1
@property (nonatomic, strong, nullable) NSString *name;
// 2
@progerty(nonatomic,strong) NSString * _Nullable name;
// 3
@property (nonatomic, strong) NSString * __nullable name;
nonnull
// 1
@property (nonatomic, strong, nullable) NSString *name;
// 2
@property (nonatomic, strong) NSString * _Nonnull name;
// 3
@property (nonatomic, strong) NSString * __nonnull name;
- 注意点:如下写法能看懂
- 在NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END之间默认是nonnull
- 关键字不能用于基本数据类型(int ,float),nil只用于对象
null_resettable
- null_resettable :必须要处理为空情况,重写get方法
- nul_resettable作用:get方法不能返回为nil,set方法可以传空。
- 如下写法:
@property (nonatomic, strong, null_resettable) NSString *name;
// 此时需要重写get方法
- (NSString *)name
{
if (_name == nil) {
_name = @"";
}
return _name;
}
- (UIView *)view
{
if (_view == nil) {
[self loadView];
[self viewDidLoad];
}
return _view
}
_Null_unspecified
- _Null_unspecified 不确定是否为空
2.泛型 限制类型
- 泛型作用:
- 限制类型
- 提高代码规划,减少沟通成本,一看就知道集合中是什么东西
- 泛型好处:
- 1.从数组中取出来,可以使用点语法
- 2.给数组添加元素,有提示
- 泛型定义用法: 类型<限制类型>
NSMutableArray<ObjectType>
(NSSet<UITouch *> *)
- 泛型声明:在声明类型的时候,在类的后面<泛型名称>
@property (nonatomic, strong) NSMutableArray<NSString *> *arr;
如何声明一个泛型
- 什么时候使用泛型?
- 在声明类的时候,不确定某些属性或者犯法类型,在使用这个类的时候才确定,就可以使用泛型
- 自定义泛型
- 自定义Person,会一些语言(iOS,java),在声明Person,不确定这个人会什么,在使用person才知道这个Person会那些语言
// Person
#import <Foundation/Foundation.h>
@interface Person<ObjectType> : NSObject
// 语言
@property (nonatomic, strong) ObjectType language;
@end
// Langeuage
#import <Foundation/Foundation.h>
@interface Language : NSObject
@end
// iOS
#import "Language.h"
@interface iOS : Language
@end
// Java
#import "Language.h"
@interface Java : Language
@end
Java *java = [[Java alloc]init];
iOS *ios = [[iOS alloc]init];
// 首先当我们什么类型都不指定的时候,泛型默认是id
Person *p = [[Person alloc]init];
// p.language == ios 或者java 都行这个时候是 id
p.language = ios;
p.language = java;
// java
Person <Java *>*p1 = [[Person alloc]init];
// 1.如下时,会出现这样的情况:
// Incompatible pointer types assigning to 'Java *' from 'iOS *'
// 报告类型不匹配的错误
// p1.language = ios;
// 2. 正确的写法,应该是这样的
p1.language = java;
@interface Person<__covariant ObjectType> : NSObject
iOS *ios = [[iOS alloc] init];
Language *language = [[Language alloc] init];
// iOS
Person<iOS *> *p = [[Person alloc] init];
p.language = ios;
// Language
Person<Language *> *p1;
p1 = p;
@interface Person<__contravariant ObjectType> : NSObject
iOS *ios = [[iOS alloc] init];
Language *language = [[Language alloc] init];
Person<Language *> *p = [[Person alloc] init];
p.language = language;
// iOS
Person<iOS *> *p1 = [[Person alloc] init];
p1 = p;
网友评论