'Object' 无法使用 Swift 中的泛型转换为 'T'
'Object' is not convertible to 'T' using Generics in Swift
我在 Swift 中尝试使用泛型时收到一条错误消息。我正在尝试创建一个函数,它接受从 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
.. 尽管我可能误解了错误消息。有人看到我做错了什么吗?
您正在尝试将 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)
}
我相信 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 数组和字典,而不是 NSArray
和 NSDictionary
。您将节省大量复杂的 as?
转换。
我在 Swift 中尝试使用泛型时收到一条错误消息。我正在尝试创建一个函数,它接受从 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
.. 尽管我可能误解了错误消息。有人看到我做错了什么吗?
您正在尝试将 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)
}
我相信 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 数组和字典,而不是 NSArray
和 NSDictionary
。您将节省大量复杂的 as?
转换。