我们在定义一个类时,有一种情况,就是我们只有在使用时才能确定它的类型,比如数组中我们在具体使用时才知道自己写的数组是要放哪种类型数据的, 这个时候我们应该在定义这个类时附加泛型声明.下面是OC、Swift、Dart语法中泛型的例子。
一、OC中
比如下面是NSArray类的定义: 。
@interface NSArray<__covariant ObjectType> : NSObject
- (ObjectType)objectAtIndex:(NSUInteger)index;
@end
上面的<__covariant ObjectType>
就是泛型的声明,其中__covariant
是可写可不写的,ObjectType
是一个标记的字符串,跟方法objectAtIndex:
中的保持一致即可,我们在自定义泛型时也可以写成<ABCType>
或者<T>
或者其它...。
下面的ViewController
中的array
数组就是使用时声明了元素类型<NSString *>,在取出元素时就是NSString
的实例对象, 可以直接调用NSString
的方法。
// 一个例子
@interface ViewController ()
@property (nonatomic, strong) NSMutableArray<NSString *> *array;
@end
使用时写明泛型具体类型
的好处是我们在取出里面一个元素时,可以直接对这个元素调用具体类型
中的方法。
进行其它类型的操作时会有警告:
![](https://img.haomeiwen.com/i2655527/fcfc42645ec2c922.png)
二、Swift中
下面代码中<T>就是代表是泛型,它的参数a和b都是泛型。
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
The Swift Programming Language - Generic
三、Flutter中
将List中元素声明为String类型,后面操作的元素都是这个类型。
var names = List<String>();
names.addAll(['Seth', 'Kathy', 'Lars']);
// 报错 The argument type 'int' can't be assigned to the parameter type 'String'.
names.add(42);
自己动手将泛型用起来就很容易理解了,各个语言只是写法上的不同。
网友评论