无法将通用类型的“ Int”类型的值转换为预期的参数类型“ Int”

时间:2019-01-24 16:45:01

标签: swift generics

我已经使用带有通用参数的方法创建了一个简单的协议。

protocol NotifyDataSelected: class {
  func notify<T>(data: T, value:T, at indexPath: IndexPath?)
}

我已经实现了如下所示的协议功能:

extension MainButtons: NotifyDataSelected {

  func notify<Int>(data: Int, value: Int, at indexPath: IndexPath?) {
    buttonSelection.updateTag(tag:value, for:indexPath)
  }

}

updateTag的签名是:

  func updateTag(tag:Int, for indexPath:IndexPath) {
  }

编译器发出实际上是矛盾的错误: enter image description here

为什么?

这是使用Xcode 10和Swift 4.2

1 个答案:

答案 0 :(得分:4)

func notify<Int>(data: Int, value: Int, at indexPath: IndexPath?) {
   buttonSelection.updateTag(tag:value, for:indexPath)
}

这不是您实现采用Int的方法的方式。 <Int>意味着您有一个带有名为Int的参数的通用方法。不是整数类型Int,而是泛型参数的名称,与<T>相同:

enter image description here

如果在协议中声明泛型方法,则不能仅实现一种类型,而必须实现所有类型。

您实际上可能想使用具有关联类型而不是泛型的协议:

protocol NotifyDataSelected: class {
    associatedtype T
    func notify(data: T, value:T, at indexPath: IndexPath?)
}

extension MainButtons: NotifyDataSelected {
    typealias T = Int
    func notify(data: Int, value: Int, at indexPath: IndexPath?) {
    }
}