斯威夫特3:不能调用(协议法)类型的参数列表(通用)
问题描述:
鉴于此协议:斯威夫特3:不能调用(协议法)类型的参数列表(通用)
import Foundation
protocol Updatable {
associatedtype E
func updateValuesWith(_ newElement: E)
}
实施这一项目:
private func update<T: NSObject>(_ values: inout [T], with newValues: [T]) where T: Updatable {
guard values.count != 0 else { values = newValues; return }
for newElement in newValues {
let newIndex = newValues.index(of: newElement)
if values.contains(newElement) {
let oldIndex = values.index(of: newElement)
values[oldIndex!].updateValuesWith(newElement) //<--- PROBLEM HERE
if oldIndex != newIndex {
swap(&values[oldIndex!], &values[newIndex!])
}
} else {
values.insert(newElement, at: newIndex!)
}
}
for element in values where values.index(of: element)! > newValues.count {
values.remove(at: values.index(of: element)!)
}
}
我不明白为什么我收到这个错误讯息
不能与类型的参数列表“(T)”
调用“updateValuesWith”预期类型的上线一个参数列表 '(T.E)'
。
经过一番不切实际的研究,我确信我必须错过一些非常基本的东西,但仍然无法弄清楚究竟是什么。
请赐教吗?
答
您正在声明输入参数类型T
为Updatable
,但您的updateValuesWith
不包含T
。它需要另一种类型E
,你根本没有指定。如果你希望你的代码按原样编译,你必须告诉什么是E
应该是编译器:
... where T: Updatable, T.E == T
,因为我不知道updateValuesWith
怎么知道该怎么做这是有点儿奇怪,当newElement
做没有实现任何有用的接口(除了将它强制转换为你所期望的)。但这将是一个不同的问题...
好吧我明白了,谢谢你。 'Updatable'是我模型中几个类遵循的协议,它们都有自己的协议方法实现,所以它们都实现了“有用的接口”。这听起来是对的还是有最佳做法,你可以分享? – Herakleis