'对象'不可转换为' T'在Swift中使用Generics

时间:2015-03-11 23:34:20

标签: ios swift generics

尝试在Swift中使用Generics时收到错误消息。我正在尝试创建一个函数,它接受任何继承自Parent的对象,并修改inout引用,恰好是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 ..虽然我可能错误地解释了错误消息。有谁看到我做错了什么?

2 个答案:

答案 0 :(得分:6)

您正在尝试将Object添加到T : Parent数组中。但仅仅因为ObjectParent的子类并不意味着TObject。在运行时,T可能是DinosaurParent的另一个子类,并且向该数组添加addMe将无效。

一种解决方案是将addMe初始化为T(),并可选择转换为Object,如下所示:

for object in myArray {
    var addMe = T()

    if let addMe = addMe as? Object {
        // do Objecty stuff here
    }

    //...

    objects.append(addMe)
}

答案 1 :(得分:3)

我相信Aaron让你走在正确的轨道上,但请注意,这可能意味着滥用泛型。你更有可能意味着:

func myFunction(data: NSDictionary, inout objects: [Parent]) { ... }

没有理由说&#34; T,其中T是Parent的子类。&#34;那只是&#34;父母&#34;在大多数OOP系统中(包括Swift)。

这也是处理回报的一种非常令人惊讶的方式。 Swift中的常规方法是:

func myFunction(data: [String : [Object]) -> [Parent] { ... }

在Swift中传递一个空数组并让函数填充它是非常罕见的。你通常生成数组并返回它。 Swift具有出色的写时复制语义,使得这种语法更加便宜(与C ++ per-move-semantics不同,这种模式更常见)。

尽可能尝试使用Swift Arrays和Dictionaries而不是NSArrayNSDictionary。您将节省大量复杂的as?次转化。