'Object' 无法使用 Swift 中的泛型转换为 'T'

'Object' is not convertible to 'T' using Generics in Swift

我在 Swift 中尝试使用泛型时收到一条错误消息。我正在尝试创建一个函数,它接受从 Parent 继承的任何对象,并修改一个 inout 引用,它恰好是 ArrayT: 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 初始化为 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, where T is a subclass of Parent."在大多数OOP系统(包括Swift)中就是"Parent"。

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

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

在 Swift 中传递一个空数组并让函数填充它是极其不常见的。您通常会生成数组并 return 它。 Swift 具有出色的写时复制语义,这使得它变得便宜(不像 C++ 每次移动语义,这种模式更常见)。

尽可能使用 Swift 数组和字典,而不是 NSArrayNSDictionary。您将节省大量复杂的 as? 转换。