ios - swift 3 : Cannot invoke (protocol method) with argument list of type (generic)

标签 ios swift generics swift-protocols associated-types

鉴于此协议(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/

相关文章:

ios - 为从字符串文字分配的 NSStrings 获取相同的内存地址

ios - 向 TableView 中的行添加边距/填充 - objective-c

ios - swift如何去除inputView下的灰色层

c# - 你能在 T 是任何类型的地方捕获异常吗?

swift - 如何在 Swift 中添加此通用数据类型的扩展?

ios - 分享视频到 Facebook - Swift IOS

ios - 我的自定义单元格的标签大小不会改变,即使是硬编码值也是如此。什么可以阻止这种情况?

ios - 以编程方式修改 NSLocationWhenInUseUsageDescription

swift - 以协议(protocol)和符合类(!)实例作为参数的函数

java - 如何以通用方式处理数字?