鉴于此协议:
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)'
的参数列表
在values[oldIndex!].updateValuesWith(newElement)
行。
经过一些无益的研究后,我确信我必须遗漏一些非常基本的东西,但仍然无法弄清楚到底是什么。
请告诉我?
答案 0 :(得分:1)
您将输入参数类型T
声明为Updatable
,但您的updateValuesWith
不会T
。它需要另一种类型E
,您根本没有指定。如果您希望代码按原样编译,则必须告诉编译器E
应该是什么:
... where T: Updatable, T.E == T
这有点奇怪,因为我不知道当updateValuesWith
没有实现任何有用的接口时(newElement
强制执行任何有用的接口除外)// my result is a result of this calculation
var val=10;
feb=[0,1];
for(var i=2; i<=val; i++){
feb[i]= feb[i-2] + Math.pow(feb[i-1],2);
}
console.log(feb[val-1])
如何知道该做什么。但这将是一个不同的问题......