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