鉴于此协议(protocol):
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)!)
}
}
我不明白为什么会收到此错误消息
Cannot invoke 'updateValuesWith' with an argument list of type '(T)'
Expected an argument list of type '(T.E)'
在线 values[oldIndex!].updateValuesWith(newElement)
。
经过一些毫无结果的研究,我确信我一定遗漏了一些非常基本的东西,但仍然无法弄清楚到底是什么。
请赐教?
最佳答案
您将输入参数类型 T
声明为Updatable
,但您的 updateValuesWith
不采用 T
。它采用您根本没有指定的另一种类型 E
。如果您希望您的代码按原样编译,您必须告诉编译器什么是 E
应该是什么:
... 其中 T:可更新,T.E == T
这有点奇怪,因为我不知道 updateValuesWith
是如何知道要做什么的,当 newElement
没有实现任何有用的接口(interface)(除了强制转换成你期望的它是)。但那将是一个不同的问题......
关于ios - swift 3 : Cannot invoke (protocol method) with argument list of type (generic),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44120082/