簡體   English   中英

使用Swift中的Generics,'Object'不能轉換為'T'

[英]'Object' is not convertible to 'T' using Generics in Swift

嘗試在Swift中使用Generics時收到錯誤消息。 我正在嘗試創建一個函數,它接受從Parent繼承的任何對象,並修改一個inout引用,恰好是一個T: ParentArray 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數組中。 但是因為ObjectParent的子類並不意味着TObject 在運行時, T可能是DinosaurParent另一個子類,並且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而不是NSArrayNSDictionary 你會節省很多復雜as? 轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM