[英]Assigning generic type to generic with AnyObject type
我可以使用Swift的数组轻松完成此操作,而不会出现任何编译器错误:
let array: Array<AnyObject> = Array<String>()
但是,当我尝试对自定义类型执行相同操作时,出现编译器错误:
class Bar<T> {
}
let bar: Bar<AnyObject> = Bar<String>()
错误是:
无法将'Bar <String>'类型的值转换为指定的'Bar <AnyObject>'类型
如何使用自定义类型实现与本机Swift数组相同的行为?
首先,请注意,您似乎无法从[Any]
到[String]
轻松地执行您的第一次分配:看来可行的原因是,您实际上是使用空数组初始化了Any
元素的数组(碰巧是[String]
类型)。 如果尝试使用包含实际元素的[String]
数组初始化Any
数组,则会遇到运行时错误:
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
:
let anyArr4: Array<Any> = [String](count: 2, repeatedValue: "foo").map{ $0 as Any }
print(anyArr4)
// prints "["foo", "foo"]", ok
由于Swift是强类型的,因此Bar<Any>
和Bar<String>
本质上是两种不同的类型。 如果要彼此初始化,则必须为此自定义初始化程序,因为在这两种不同类型之间进行简单分配或强制转换将失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.