Objective-C的泛型
使用场景
- 限制集合中的类型,减少类型转换的代码,将类型检查的工作从开发者转移给编译器。
- 自定义类,当某个属性类型不确定,只有创建的时候才能确定时,可以使用泛型来规范这个类型。
__covariant 与 __contravariant 的区别
-
__covariant
协变 向上转型 子类可以转父类 -
__contravariant
逆变 向下转型 父类转子类 - 如果不声明
__convariant
或者__contravariant
那么两个方向都不可以转换
// Container
@interface Container<ObjectType> : NSObject
@end
// Box类继承至Container
@interface Box : Container
@end
// Desk
@interface Desk<__covariant ObjectType> : NSObject
@property (nonatomic, strong) Container<ObjectType> *containter;
@end
// 使用
Desk<Container *> *deskA = [[Desk alloc] init];
Desk<Box *> *deskB = [[Desk alloc] init];
// deskB = deskA;
deskA = deskB;
swift中的泛型
案例
在swift中不允许类型隐式转换,如果定义的函数是交换两个整数的,那么如果用来交换两个浮点数那是不允许的,所以需要泛型来写一个通用的函数。
// 单一占位符的函数
func swap<ObjectType>( number1: inout ObjectType, number2: inout ObjectType) {
let temp = number1;
number1 = number2;
number2 = temp;
}
var s1 = "hello"
var s2 = "world"
swap(&s1, &s2)
s1
s2
var i1 = 89
var i2 = 45
swap(&i1, &i2)
i1
i2
// 多个占位符的泛型函数
func conect<FirstObjectType, SecondObjectType>(num1: FirstObjectType, num2: SecondObjectType) -> String {
let temp = "\(num1)" + "\(num2)"
return temp
}
let re1 = conect(num1: "nihao", num2: 123)
// 泛型类
class ObjTypeClass<ObjectType> {
var values = [ObjectType]()
func display() {
for i in 0 ..< self.values.count {
print(values[i])
}
}
}
let v:ObjTypeClass<String> = ObjTypeClass<String>()
v.values = ["hello world", "apple", "jobs"]
v.display()
网友评论