繁体   English   中英

将通用类型分配给具有AnyObject类型的通用类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM