范型
范型编程是一种程序语言设计范式,它允许程序员在使用强类型的语言编写代码的时候,延迟确定具体的类型。
以Swift代码为例,假如有一个需求是要交换两个int,很容易写出类似代码
func swapTwoInts(_ a: inout Int, _ b: inout Int) {
let temporaryA = a
a = b
b = temporaryA
}
然后,又来了个需求,交换两个double,
func swapTwoDoubles(_ a: inout Double, _ b: inout Double) {
let temporaryA = a
a = b
b = temporaryA
}
于是,有一种类型,就需要Copy/Paste一遍。有一天交换的逻辑要更改,你会发现一下子需要改许多地方。
范型完美的解决了这个问题,使用范型编写的代码,不需要指定具体的类型,而是使用占位符
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
Objective C 范型
Objective C支持轻量级的范型。在编写自定义的范型类之前,我们先来看看Cocoa Touch的集合类(NSArray,NSDictionary,NSSet
)对于范型的支持。
首先创建一个数组,这个数组只应该用来存储字符串:
NSMutableArray * array = [[NSMutableArray alloc] init];
[array addObject:@"1"];
//误加了一个非字符串类型进去
[array addObject:@(0)];
这时候,对数组中元素进行遍历,Crash:
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSInteger length = [obj length];
}];
Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘-[__NSCFNumber length]: unrecognized selector sent to instance 0xb000000000000002’
如果编译器能帮助我们来确保加入数组中的元素都是String就好了
范型可以帮助我们解决这个问题:
//创建一个保存字符串的数组
NSMutableArray<NSString *> * array = [[NSMutableArray alloc] init];
[array addObject:@"1"];
[array addObject:@(0)];
往这个数组里加入非字符串类型的对象时,编译器会给出警告:
同样的,NSDictionary和NSSet也支持范型:
NSDictionary<NSString *, NSNumber *> * di