2016-03-01 78 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的數組不會失敗。但是自定義類型仍然顯示與問題中提到的相同的錯誤。 –