Swift 3: 无法使用(通用)类型的参数列表调用(协议方法)
Swift 3: Cannot invoke (protocol method) with argument list of type (generic)
鉴于此协议:
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
应该是什么:
... where T: Updatable, T.E == T
这有点奇怪,因为我不知道 updateValuesWith
是如何知道该做什么的,当 newElement
没有实现任何有用的接口(除了强制将其强制转换为您期望的样子) .但那将是一个不同的问题...
鉴于此协议:
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
应该是什么:
... where T: Updatable, T.E == T
这有点奇怪,因为我不知道 updateValuesWith
是如何知道该做什么的,当 newElement
没有实现任何有用的接口(除了强制将其强制转换为您期望的样子) .但那将是一个不同的问题...