iOS 关键字 及 泛型的使用 和 协变、逆变
来源:互联网 发布:sap 工厂物料组主数据 编辑:程序博客网 时间:2024/06/13 05:39
关键字
1、nullable 和 nonnull
nullable:表示可以为空nonnull:表示非空
在属性中的书写规范:
// 方式1@property (nonatomic, strong, nullable) NSString *name1;@property (nonatomic, strong, nonnull) NSString *name1;// 方式2@property (nonatomic, strong) NSString * _Nullable name2;@property (nonatomic, strong) NSString * _Nonnull name2;// 方式3@property (nonatomic, strong) NSString * __nullable name3;@property (nonatomic, strong) NSString * __nonnull name3;
在方法中的书写规范:
- (NSString * _Nullable)text:( NSString * _Nullable)str;- (nonnull NSString *)text1:(nonnull NSString *)str;
需要注意的是,这两个关键字只能修饰对象类型,不能修饰基本数据类型
系统还定义了两个宏:NS_ASSUME_NONNULL_BEGIN
NS_ASSUME_NONNULL_END
在这两个宏之间定义的所有对象属性方法默认都是nonnull
2、null_resettable
null_resettable:get方法返回不能为空,set方法参数可以为空
用来修饰属性,一旦使用,必须重写该属性的get方法或者set方法,处理传递值为空的情况
在属性中的书写规范:
@property (strong, nonatomic, null_resettable) NSString *str;
3、null_unspecified
null_unspecified不确定是否为空
在属性中的书写规范:
// 方式1@property (strong, nonatomic) NSString * _Null_unspecified str;// 方式2@property (strong, nonatomic) NSString * __null_unspecified str;
泛型
泛型:用于限制类型,常用于数组,字典,集合中职能修饰方法调用好处:1、减少程序员的交流2、可以直接使用点语法
在属性中的书写规范:
@property (strong, nonatomic) NSMutableArray<NSString *> *arr;
自定义泛型
当声明一个类,类中的某些属性的类型不确定时,需要使用泛型。
用例子说明自定义泛型:
先创建一个语言类Language
,再创建两个基于Language
的语言类,分别是 iOS
和Java
如:
Language类
#import <UIKit/UIKit.h>@interface Language : NSObject@end
iOS类
#import "Language.h"@interface iOS : Language@end
Java类
#import "Language.h"@interface Java : Language@end
创建Person
类 如:
#import <Foundation/Foundation.h>@interface Person<ObjectType> : NSObject@property (nonatomic, strong)ObjectType language;@end
只列出以上类的.h
文件,.m
文件没有添加方法和属性
在控制器的viewDidLoad
方法中:
- (void)viewDidLoad { [super viewDidLoad]; Person<iOS *> *p1 = [[Person alloc] init]; p1.language = [[iOS alloc] init]; Person<Java *> *p2 = [[Person alloc] init]; p2.language = [[Java alloc] init];}
Person<iOS *> *p1
这样写,创建p1对象的language属性就只能是iOS类的对象,同理,p2对象的language属性就只能是Java类的对象。
协变,异变
__covariant 协变 用于 泛型 的数据类型强转,可以向上强转,子类 可以转成 父类
例如:
修改Person.h
,在ObjectType
前添加__covariant
#import <Foundation/Foundation.h>@interface Person<__covariant ObjectType> : NSObject@property (nonatomic, strong)ObjectType language;@end
在控制器的viewDidLoad
方法中:
- (void)viewDidLoad { [super viewDidLoad]; Person<Language *> *p = [[Person alloc] init]; Person<iOS *> *iOSP = [[Person alloc] init]; p.language = [[iOS alloc] init]; // 如果子类想给父类赋值,用到协变 p = iOSP;}
__contravariant:逆变 用于 泛型 的数据类型强转,可以向下强转,父类 可以转成 子类
例如:
修改Person.h
,在ObjectType
前添加__contravariant
#import <Foundation/Foundation.h>@interface Person<__contravariant ObjectType> : NSObject@property (nonatomic, strong)ObjectType language;@end
在控制器的viewDidLoad
方法中:
- (void)viewDidLoad { [super viewDidLoad]; Person<Language *> *p = [[Person alloc] init]; p.language = [[Java alloc] init]; Person<iOS *> *iOSP = [[Person alloc] init]; p.language = [[iOS alloc] init]; // 如果父类想给子类赋值,用到逆变 iOSP = p;}
转载请注明出处,万分感谢!
阅读全文
0 0
- iOS 关键字 及 泛型的使用 和 协变、逆变
- 泛型类型的转换,协变和逆变
- C# 泛型的协变和逆变
- C# 泛型的协变和逆变
- C# 泛型的协变和逆变
- Kotlin 泛型的协变和逆变
- C# 泛型的协变和逆变
- 泛型的协变,逆变
- C#的协变和逆变
- C#泛型的协变和抗变
- 泛型的逆变和抗变
- 型变的理解,逆变与协变
- 协变和逆变
- 协变和逆变
- 协变和逆变
- 协变和逆变
- asp.net 泛型的 协变与逆变
- Scala中的类、接口及协变和逆变
- 编译安装apache
- 求一个函数返回参数的二进制中1的个数
- 增量/差量更新 编译生成so库
- Ext.encode 与 Ext.decode_爱胖迪
- HTML&CSS基础篇之二:HTML应用定位
- iOS 关键字 及 泛型的使用 和 协变、逆变
- CSR BC5 Bluetooth auto reconnect fail issue debug
- 用js显示和隐藏div
- Hive2.0函数大全
- MySQL简单主从方案及暴露的问题
- Python 函数参数引用(传值 or 传址)copy和deepcopy
- C_逻辑题:海盗很厚道
- 在salesforce中实现鼠标悬停显示提示框效果,并对显示框内容进行微缩页面布局
- 利用Solidworks Motion将带有质量信息和关节约束的三维模型导入ADAMS