尝试在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
..虽然我可能错误地解释了错误消息。有谁看到我做错了什么?
答案 0 :(得分:6)
您正在尝试将Object
添加到T : Parent
数组中。但仅仅因为Object
是Parent
的子类并不意味着T
是Object
。在运行时,T
可能是Dinosaur
,Parent
的另一个子类,并且向该数组添加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而不是NSArray
和NSDictionary
。您将节省大量复杂的as?
次转化。