swift - Swift 中的“无法推断通用参数‘T’”错误
问题描述
我正在尝试练习“通用类”。我遇到了2个错误:
无法推断泛型参数“T”
对泛型类型“GenericObject”的引用需要 <...> 中的参数
课堂上的2个错误GenericManager
。请参考以下代码。我该如何解决这个问题?
class User {
var name: String
init(name: String) {
self.name = name
}
}
class Employee {
var name: String
var position: String
init(name: String, position: String) {
self.name = name
self.position = position
}
}
class GenericObject<T> {
var items = [T]()
init(forType: T.Type) {}
func addObject(_ obj: T) {
self.items.append(obj)
}
}
class GenericManager {
//issue: Generic parameter 'T' could not be inferred
var objects = [GenericObject]()
//issue: Reference to generic type 'GenericObject' requires arguments in <...>
func addObject(_ obj: GenericObject) {
self.objects.append(obj)
}
}
let u = User(name: "User")
let uo = GenericObject(forType: User.self)
uo.addObject(u)
let e = Employee(name: "Employee", position: "session manager")
let eo = GenericObject(forType: Employee.self)
eo.addObject(e)
let manager = GenericManager()
manager.addObject(uo)
manager.addObject(eo)
解决方案
编译器需要知道 的类型T
,在这种情况下您没有提供它。
你可以这样做:
var objects = [GenericObject<YourTypeHere>]()
例如,如果GenericObject
将保存一个 数组Int
,它看起来像这样:
var objects = [GenericObject<Int>]()
我注意到你更新了你的问题。知道您要达到的目标会有所帮助,但无论如何我都会尽力帮助您。
当你有一个泛型对象时,你需要在编译时告诉编译器泛型的类型,这就是为什么它抱怨无法推断类型,它需要知道。
由于您希望能够将对象添加到GenericManager
数组中,因此您需要这两种情况下的泛型相同,因此您可以像这样修改您的类:
class GenericManager<T> {
var objects = [GenericObject<T>]()
func addObject(_ obj: GenericObject<T>) {
self.objects.append(obj)
}
}
但是,由于对象必须具有相同的泛型,因此您不能将GenericObject<User>
and添加GenericObject<Employee>
到同一个管理器,您可以将它们实现为GenericObject<Any>
,并对 执行相同的操作GenericManager
,然后它将如下所示:
let u = User(name: "User")
let uo = GenericObject(forType: Any.self)
uo.addObject(u)
let e = Employee(name: "Employee", position: "session manager")
let eo = GenericObject(forType: Any.self)
eo.addObject(e)
let manager = GenericManager<Any>()
manager.addObject(uo)
manager.addObject(eo)
请记住,这将使您失去泛型所能做的任何优势,您可以做的是创建一个协议或公共超类并使用它而不是Any
,但这取决于您要实现的目标。
如果您还有其他问题,请添加评论,而不是默默地更新您的问题。
推荐阅读
- python - 使用转换器提升 Python 问题 - 静态链接
- cassandra - 将 Janusgraph 从 0.2.2 升级到 0.5.2
- html - 垂直对齐 mat-checkbox 和 mat-form-field | 角材料 | 角
- azure-cosmosdb - 是否建议在 cosmosdb 中有大量的逻辑分区
- linux - 如何通过shell脚本向csv文件的第一列添加值
- ruby - 从标准输入加载 gemspec
- python-3.x - 如果我使用动作属性,Django 表单不会保存
- c - 在scanf中读取字符'-'
- asp.net-core - AddWebhookNotification 调用Controller中的方法
- html - 使用 Crispy Forms 渲染 django 的 Multiwidget 和 MutliValueField 文本区域