我已经使用带有通用参数的方法创建了一个简单的协议。
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
答案 0 :(得分:4)
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?) {
}
}