使用Swift中的Generics,'Object'不能转换为'T'

sty*_*972 3 generics ios swift

尝试在Swift中使用Generics时收到错误消息.我试图创建一个函数,它从继承的任何对象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'
    }

}
Run Code Online (Sandbox Code Playgroud)

我将它传递到堆栈上方的函数中.

var objects: [Object] = []

myClass.myFunction(data, objects: &objects)
Run Code Online (Sandbox Code Playgroud)

即使Object定义如下,继承自Parent

class Object: Parent {
    //...
}
Run Code Online (Sandbox Code Playgroud)

它给了我一个错误,它无法转换ObjectT..虽然我可能错误地解释了错误消息.有谁看到我做错了什么?

Aar*_*ger 6

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

一种解决方案是初始化addMeT(),并且可选地强制转换为Object,如下所示:

for object in myArray {
    var addMe = T()

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

    //...

    objects.append(addMe)
}
Run Code Online (Sandbox Code Playgroud)