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 没有实现任何有用的接口(除了强制将其强制转换为您期望的样子) .但那将是一个不同的问题...