[英]'Object' is not convertible to 'T' using Generics in Swift
嘗試在Swift中使用Generics時收到錯誤消息。 我正在嘗試創建一個函數,它接受從Parent
繼承的任何對象,並修改一個inout
引用,恰好是一個T: Parent
的Array
T: Parent
func myFunction<T: Parent>(data: NSDictionary, inout objects: Array<T>) {
let myArray = data.valueForKey("the_array") as NSArray
for object in myArray {
var addMe: Object = Object()
//...
objects.append(addMe) //'Object' is not convertible to 'T'
}
}
我將它傳遞到堆棧上方的函數中。
var objects: [Object] = []
myClass.myFunction(data, objects: &objects)
即使Object
定義如下,繼承自Parent
class Object: Parent {
//...
}
它給了我一個錯誤,它無法將Object
轉換為T
..雖然我可能錯誤地解釋了錯誤消息。 有誰看到我做錯了什么?
您正在嘗試將Object
添加到T : Parent
數組中。 但是因為Object
是Parent
的子類並不意味着T
是Object
。 在運行時, T
可能是Dinosaur
, Parent
另一個子類,並且addMe
數組添加addMe
將無效。
一種解決方案是將addMe
初始化為T()
,並可選擇轉換為Object
,如下所示:
for object in myArray {
var addMe = T()
if let addMe = addMe as? Object {
// do Objecty stuff here
}
//...
objects.append(addMe)
}
我相信Aaron讓你走在正確的軌道上,但請注意,這可能意味着濫用泛型。 你更有可能意味着:
func myFunction(data: NSDictionary, inout objects: [Parent]) { ... }
沒有理由說“T,其中T是Parent的子類。” 在大多數OOP系統(包括Swift)中,這只是“父”。
這也是處理回報的一種非常令人驚訝的方式。 Swift中的常規方法是:
func myFunction(data: [String : [Object]) -> [Parent] { ... }
在Swift中傳遞一個空數組並讓函數填充它是非常罕見的。你通常生成數組並返回它。 Swift具有出色的寫時復制語義,這使得這種語法更加便宜(不像C ++ per-move-semantics,這種模式更常見)。
盡可能嘗試使用Swift Arrays和Dictionaries而不是NSArray
和NSDictionary
。 你會節省很多復雜as?
轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.