Swift基础学习<二十一>:泛型-泛型对象

深渊向深渊呼唤

泛型对象:

在上面的 TestStruct 实例中,关联类型和Self关键字都是在协议层面的泛型,此外还有对象层面的泛型,比如我们常用的数组就是用对象层面的泛型定义的,效果相同,如果不使用协议,一个泛型对象风格的结构体定义如下:
struct TestStruct< T: Comparable> {
	func elementMethod1(element:T) {
		print(“elementFromMethod1:\(element)”)
	}

	func elementMethod2(element:T) {
		print(“elementFromMethod2:\(element)”)
	}
}
let test = TestStruct<Int>()
test.elementMethod1(1).

需要明确的一点是,泛型应该用在声明中,调用时版本中的泛型已经被“特化”成具体的类型。泛型协议依靠遵守者中协议方法的具体实现来明确泛型的类型,而泛型对象则通过构造器初始化时明确泛型的类型,这些类型都是具体的。如果你尝试在实现时“嵌套”一个泛型,那么会导致泛型无法被特化。比如数组本身是泛型的,在声明数组类型时传入了另一个泛型,那么你将无法初始化该数组:
struct TestStruct<T :Comparable > {
	var array:[T] = [1,2,””] //报错
}

你可能认为1,2 和“” 都满足 Comparable,所以符合 array声明的上下文,但是忽略了数组本身就是泛型的,传入一个泛型 T 后就造成了泛型的 “嵌套”,使得数组无法被初始化。 使用上面定义的泛型协议和泛型对象,方法的参数都是相同类型的,在实例中调用方法时,方法的参数实际上是确定的,如果你想保持方法的泛型,则需要定义泛型的方法。 还是没懂。。。。待补充总结。

栏目