簡體   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