在iOS開發(fā)中,泛型的使用,可以減少溝通的成本,明確類型。
相信大家在開發(fā)中,或多或少,都接觸或使用過泛型。比如在定義一些裝有特定類型的數(shù)組時,會這樣寫
NSMutableArray <CarModel *> *dataSource
這樣就表明了,dataSource這個數(shù)組中,放的是CarModel。使用objectForKey 可以直接用點語法,點出模型內(nèi)部的屬性進(jìn)行使用。
[self.dataSource objectAtIndex:0].property;
在給數(shù)組添加數(shù)據(jù)時,也會有提示指明數(shù)組中的類型。
[self.dataSource addObject:(nonnull CarModel *)];
如果添加了錯誤的類型,會有警告。
[self.dataSource addObject:@""];
Incompatible pointer types sending 'NSString *' to parameter of type 'CarModel * _Nonnull'
自定義泛型類
在聲明類的時候,不確定某些屬性或者方法類型,在使用這個類的時候才確定,就可以采用泛型。
在聲明類的時候,在類的后面<泛型名稱>
@interface Person<__covariant ObjectType> : NSObject
@property (nonatomic, strong) ObjectType language;
Language : NSObject
#import <Foundation/Foundation.h>
@interface Language : NSObject
@end
.Java : Language
#import "Language.h"
@interface Java : Language
@end
.iOS : Language
#import "Language.h"
@interface iOS : 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;
}
__covariant:協(xié)變, 子類轉(zhuǎn)父類
__contravariant:逆變 父類轉(zhuǎn)子類
規(guī)范是死的,人是活的。 不能說我們定義了規(guī)范,就必須使用泛型。
如果需求是:數(shù)組內(nèi),分別有不同類型的對象,你還在糾結(jié)怎么用泛型。。。
總之,要具備這樣的思想,而不是很刻板的去遵守。