首页 > 解决方案 > 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)

标签: swift

解决方案


编译器需要知道 的类型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,但这取决于您要实现的目标。

如果您还有其他问题,请添加评论,而不是默默地更新您的问题。


推荐阅读