无法将类型“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
的方法的方式。 <Int>
表示您有一个带有名为 Int
的参数的泛型方法。不是整数类型Int
,而是泛型参数的名称,和<T>
一样:
如果你在协议中声明一个泛型方法,你不能只实现一种类型,你必须实现所有类型。
您实际上可能希望使用具有关联类型而不是泛型的协议:
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
无法将类型“[Surah]”的值转换为预期的参数类型“Range<Int>”