iOS-关键字-泛型ObjectType 协变__covariant 逆变__contravariant
2018-03-05 17:48
344 查看
一.泛型作用 泛型:限制类型 为什么要推出泛型?迎合swift 泛型作用:1.限制类型 2.提高代码规划,减少沟通成本,一看就知道集合中是什么东西二.泛型用法: __covariant:协变, 子类转父类 __contravariant:逆变 父类转子类1.泛型声明:在声明类的时候,在类的后面<泛型名称> //第一步 声明泛型 @interface Person<__covariant ObjectType> : NSObject // 语言 @property (nonatomic, strong) ObjectType language;
2.使用泛型 类型<限制类型> // iOS Person<iOS *> *p = [[Person alloc] init]; p.language = ios; 不遵守泛型仅仅是报警告三.泛型在开发中的使用 泛型在开发中使用场景:1.用于限制集合类型
泛型好处:1.从数组中取出来,可以使用点语法 2.给数组添加元素,有提示@property (nonatomic,strong)NSMutableArray<NSString *> *arr;限制数据里面的集合是NSString id是不能使用点语法 泛型注意点:在数组中,一般用可变数组添加方法,泛型才会生效,如果使用不可变数组,添加元素,泛型没有效果
四.泛型使用举例 什么时候使用泛型?在声明类的时候,不确定某些属性或者方法类型,在使用这个类的时候才确定,就可以采用泛型 自定义Person,会一些编程语言(iOS,Java),在声明Person,不确定这个人会什么,在使用Person才知道这个Person会什么语言 如果没有定义泛型.默认就是id<一>.先自定义类1.自定义Person类.里面有一个language属性,不知道是什么类型的,自定义为泛型,并且添加协变和逆变// Person.h#import <Foundation/Foundation.h>//第一步 声明泛型//__covariant 协变,子类转父类 泛型名字是ObjectType@interface Person<__covariant ObjectType> :NSObject// 语言@property (nonatomic,strong) ObjectType language;@end2.Language : NSObject#import <Foundation/Foundation.h>@interface Language : NSObject@end3.Java : Language#import "Language.h"@interface Java : Language@end4.iOS : Language#import "Language.h"@interface iOS : Language@end
<二>定义好了,下面介绍如何使用1.首先是没有协变和逆变#import <Foundation/Foundation.h>// 泛型名字是ObjectType@interface Person<ObjectType> : NSObject// 语言@property (nonatomic,strong) ObjectType language;@end
- (void)test{ Java *java = [[Javaalloc]init]; iOS *ios = [[iOSalloc]init]; // iOS 指定这个人会的是iOS Person<iOS *> *p = [[Personalloc]init]; p.language = ios; // Java 指定这个人会的是Java Person<Java *> *p1 = [[Personalloc]init]; p1.language = java;
}
2.添加了协变#import <Foundation/Foundation.h>//第一步 声明泛型//__covariant 子类转父类 泛型名字是ObjectType@interface Person<__covariant ObjectType> : NSObject// 语言@property (nonatomic, strong) ObjectType language;@end
// 子类转父类- (void)covariant{ iOS *ios = [[iOSalloc]init]; Language *language = [[Languagealloc]init]; // iOS 只会iOS Person<iOS *> *p = [[Personalloc]init]; p.language = ios; // Language 都会 Person<Language *> *p1 = [[Personalloc]init]; p1 = p;//如果没添加协变会报指针类型错误警告}
3.添加了逆变#import <Foundation/Foundation.h>//第一步 声明泛型//__contravariant 可以逆变,父类转子类 泛型名字是ObjectType@interface Person<__contravariant ObjectType> : NSObject// 语言@property (nonatomic, strong) ObjectType language;@end
- (void)contravariant { //第二步 定义泛型 iOS *ios = [[iOSalloc]init]; Language *language = [[Languagealloc]init]; // 父类转子类 都会 Person<Language *> *p = [[Personalloc]init]; p.language = language; // iOS 只会iOS Person<iOS *> *p1 = [[Personalloc]init]; p1 = p; //如果没添加逆变会报指针类型错误警告
}
2.使用泛型 类型<限制类型> // iOS Person<iOS *> *p = [[Person alloc] init]; p.language = ios; 不遵守泛型仅仅是报警告三.泛型在开发中的使用 泛型在开发中使用场景:1.用于限制集合类型
泛型好处:1.从数组中取出来,可以使用点语法 2.给数组添加元素,有提示@property (nonatomic,strong)NSMutableArray<NSString *> *arr;限制数据里面的集合是NSString id是不能使用点语法 泛型注意点:在数组中,一般用可变数组添加方法,泛型才会生效,如果使用不可变数组,添加元素,泛型没有效果
四.泛型使用举例 什么时候使用泛型?在声明类的时候,不确定某些属性或者方法类型,在使用这个类的时候才确定,就可以采用泛型 自定义Person,会一些编程语言(iOS,Java),在声明Person,不确定这个人会什么,在使用Person才知道这个Person会什么语言 如果没有定义泛型.默认就是id<一>.先自定义类1.自定义Person类.里面有一个language属性,不知道是什么类型的,自定义为泛型,并且添加协变和逆变// Person.h#import <Foundation/Foundation.h>//第一步 声明泛型//__covariant 协变,子类转父类 泛型名字是ObjectType@interface Person<__covariant ObjectType> :NSObject// 语言@property (nonatomic,strong) ObjectType language;@end2.Language : NSObject#import <Foundation/Foundation.h>@interface Language : NSObject@end3.Java : Language#import "Language.h"@interface Java : Language@end4.iOS : Language#import "Language.h"@interface iOS : Language@end
<二>定义好了,下面介绍如何使用1.首先是没有协变和逆变#import <Foundation/Foundation.h>// 泛型名字是ObjectType@interface Person<ObjectType> : NSObject// 语言@property (nonatomic,strong) ObjectType language;@end
- (void)test{ Java *java = [[Javaalloc]init]; iOS *ios = [[iOSalloc]init]; // iOS 指定这个人会的是iOS Person<iOS *> *p = [[Personalloc]init]; p.language = ios; // Java 指定这个人会的是Java Person<Java *> *p1 = [[Personalloc]init]; p1.language = java;
}
2.添加了协变#import <Foundation/Foundation.h>//第一步 声明泛型//__covariant 子类转父类 泛型名字是ObjectType@interface Person<__covariant ObjectType> : NSObject// 语言@property (nonatomic, strong) ObjectType language;@end
// 子类转父类- (void)covariant{ iOS *ios = [[iOSalloc]init]; Language *language = [[Languagealloc]init]; // iOS 只会iOS Person<iOS *> *p = [[Personalloc]init]; p.language = ios; // Language 都会 Person<Language *> *p1 = [[Personalloc]init]; p1 = p;//如果没添加协变会报指针类型错误警告}
3.添加了逆变#import <Foundation/Foundation.h>//第一步 声明泛型//__contravariant 可以逆变,父类转子类 泛型名字是ObjectType@interface Person<__contravariant ObjectType> : NSObject// 语言@property (nonatomic, strong) ObjectType language;@end
- (void)contravariant { //第二步 定义泛型 iOS *ios = [[iOSalloc]init]; Language *language = [[Languagealloc]init]; // 父类转子类 都会 Person<Language *> *p = [[Personalloc]init]; p.language = language; // iOS 只会iOS Person<iOS *> *p1 = [[Personalloc]init]; p1 = p; //如果没添加逆变会报指针类型错误警告
}
相关文章推荐
- ios开发ios9新特性关键字学习:泛型,逆变,协变,__kindof
- iOS 关键字 及 泛型的使用 和 协变、逆变
- Scala的协变covariant(+),逆变contravariant(-),上界(<:),下界(>:)
- 协变covariant[+T] 逆变contravariant[-T]
- Covariant(协变)与 Contravariant(逆变)
- 泛型类型的协变(covariant)和逆变
- 一句话清晰总结协变(covariant)和逆变 (contravariant)
- Variance overview: Invariant, Covariant, Contravariant, 协变,逆变
- 一句话清晰总结协变(covariant)和逆变 (contravariant)
- c#4.0中的不变(invariant)、协变(covariant)、逆变(contravariant)小记
- 泛型类型的协变(covariant)和逆变
- 协变(covariant)和逆变(contravariant)
- iOS中assign、copy 、retain关键字的含义
- 初识IOS ,几个关键字,修饰符
- .NET泛型03,泛型类型的转换,协变和逆变
- IOS学习之二:Objective-C基础语法和关键字
- iOS中assign、copy 、retain等关键字的含义
- 关于某ios app登录关键字加密分析
- 泛型的协变,逆变
- iOS基础知识之属性及属性关键字