【问题标题】:Cannot invoke [Method] with argument list of type ( , )无法使用 ( , ) 类型的参数列表调用 [方法]
【发布时间】:2016-01-05 11:18:59
【问题描述】:

我有两个协议AB,其中B 继承自A

protocol A { }

protocol B: A { }

我有一个实用程序类,它的函数名为add,其参数应符合协议A

class Utility {
    func add<T:A>(t:T.Type,param:T){
        ....
    }
}

然后我有一个测试类,它创建Utility 的对象并调用它的函数add,它接受B 类型的参数(实现B 的类对象):

class Test {
    var util: Utility

    init() {
        util = Utility()
    }

    func addItem(data:B){
        util.add(B.self,param: data) // This line produces Cannot invoke add with argument list 
    }                         // of type (B.Protocol,param:B)
}

我做错了什么?

【问题讨论】:

  • 请简单地复制粘贴您的代码以避免发布错误。
  • 我认为您的情况可以简化为:swiftstub.com/171514009。似乎 Swift 无法处理带有约束的泛型函数中的协议类型参数。 (尚)不知道这是错误还是设计。

标签: ios swift swift2


【解决方案1】:

你的错误是你试图接受变量作为协议,而不是符合协议的类型:

func addItem(data:B){
    util.add(B.self,param: data)
} 

这很奇怪,因为您在 Utility 类中做对了。简单的解决方法是在这里做同样的事情(使用约束):

func addItem<T: B>(data: T) {
    util.add(T.self, param: data)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多