2016-03-01 29 views
0

我可以很容易地做到这一点:使用雨燕的阵列没有任何编译器错误分配泛型类型泛型与AnyObject型

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

但是当我尝试做同样与我的自定义类型,我得到的编译器错误:

class Bar<T> { 
} 

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

错误是:

Cannot convert value of type 'Bar< String>' to specified type 'Bar< AnyObject>'

我怎样才能实现与自定义类型相同的行为与本地小号Wift的数组?

回答

0

首先,请注意,你不能“容易”执行你的第一个任务,看似从[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

let anyArr4: Array<Any> = [String](count: 2, repeatedValue: "foo").map{ $0 as Any } 
print(anyArr4) 
    // prints "["foo", "foo"]", ok 

由于雨燕是强类型,Bar<Any>Bar<String>是,本质上,两种不同类型。如果您想通过其他方式初始化一个,则必须为此自定义您自己的初始化程序,因为这两个类型之间的简单分配或转换将失败。

+0

感谢您的回答。我用AnyObject而不是Any编辑了我的问题以避免混淆。在这种情况下,没有运行时错误,并且从字符串数组转换到AnyObject的数组不会失败。但是自定义类型仍然显示与问题中提到的相同的错误。 –