使用AnyObject类型将泛型类型分配给泛型

时间:2016-03-01 10:44:36

标签: ios arrays swift generics

我可以使用Swift的数组轻松完成此操作而不会出现任何编译器错误:

let array: Array<AnyObject> = Array<String>()

但是当我尝试对我的自定义类型执行相同操作时,我遇到编译器错误:

class Bar<T> { 
}

let bar: Bar<AnyObject> = Bar<String>()

错误是:

  

无法转换类型&#39; Bar&lt;的值串GT;&#39;到指定的类型   &#39;巴≤; AnyObject&GT;&#39;

如何使用自定义类型实现与原生Swift数组相同的行为?

1 个答案:

答案 0 :(得分:0)

首先,请注意,您不能“轻松”执行您的第一次作业,似乎是从AddMvc[Any]:这看似有效的原因是您事实上,使用数组(恰好是[String]类型)初始化一个Any元素数组。如果您尝试使用包含实际元素的[String]数组初始化Any数组,则会遇到运行时错误:

[String]

因此,你问题中的比较并没有多大意义。如果要在不同元素类型的两个数组实例之间进行类型转换,则需要一次执行一个元素,例如:使用let anyArr1: Array<Any> = Array<String>() // = [], ok let anyArr2: Array<Any> = [] // ok let anyArr3: Array<Any> = [String](count: 2, repeatedValue: "foo") // = ["foo", "foo"], not ok /* fatal error: can't unsafeBitCast between types of different sizes */

.map

由于Swift是强类型的,let anyArr4: Array<Any> = [String](count: 2, repeatedValue: "foo").map{ $0 as Any } print(anyArr4) // prints "["foo", "foo"]", ok Bar<Any>本质上是两种不同的类型。如果要逐个初始化,则必须为此目的自定义自己的初始值设定项,因为这两个不同类型之间的简单赋值或转换将失败。