Swift 3:无法使用类型的参数列表(泛型)调用(协议方法)

时间:2017-05-22 18:48:15

标签: ios swift generics swift-protocols associated-types

鉴于此协议:

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)行。

经过一些无益的研究后,我确信我必须遗漏一些非常基本的东西,但仍然无法弄清楚到底是什么。

请告诉我?

1 个答案:

答案 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])如何知道该做什么。但这将是一个不同的问题......