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

Posted

技术标签:

【中文标题】无法将类型“Int”的值转换为泛型中的预期参数类型“Int”【英文标题】:Cannot convert value of type 'Int' to expected argument type 'Int' in generic 【发布时间】:2019-01-24 16:45:01 【问题描述】:

我创建了一个简单的协议,其中包含一个采用泛型参数的方法。

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) 
  

编译器发出一个实际上相互矛盾的错误:

为什么?

这是使用 Xcode 10 和 Swift 4.2

【问题讨论】:

【参考方案1】:
func notify<Int>(data: Int, value: Int, at indexPath: IndexPath?) 
   buttonSelection.updateTag(tag:value, for:indexPath)

这不是您实现采用Int 的方法的方式。 &lt;Int&gt; 表示您有一个带有名为 Int 的参数的泛型方法。不是整数类型Int,而是泛型参数的名称,和&lt;T&gt;一样:

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

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

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?) 
    

【讨论】:

哇!我用 抛弃了自己,是的,你对我的意图是正确的:具有关联类型的协议。谢谢!

以上是关于无法将类型“Int”的值转换为泛型中的预期参数类型“Int”的主要内容,如果未能解决你的问题,请参考以下文章

在 swift assert(0) 中无法将 Int 类型的值转换为预期的参数类型 Bool

无法将 Int 类型的值转换为预期的参数类型 Bool

无法将类型“[Surah]”的值转换为预期的参数类型“Range<Int>”

如何在此 for 循环中修复'无法将'String'类型的值转换为预期的参数类型'Int'

将返回值转换为泛型类型

java泛型中的下限