我可以使用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数组相同的行为?
答案 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>
本质上是两种不同的类型。如果要逐个初始化,则必须为此目的自定义自己的初始值设定项,因为这两个不同类型之间的简单赋值或转换将失败。