2017-05-22 23 views
1

鉴于此协议:斯威夫特3:不能调用(协议法)类型的参数列表(通用)

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)'

经过一番不切实际的研究,我确信我必须错过一些非常基本的东西,但仍然无法弄清楚究竟是什么。

请赐教吗?

回答

1

您正在声明输入参数类型TUpdatable,但您的updateValuesWith不包含T。它需要另一种类型E,你根本没有指定。如果你希望你的代码按原样编译,你必须告诉什么是E应该是编译器:

... where T: Updatable, T.E == T

,因为我不知道updateValuesWith怎么知道该怎么做这是有点儿奇怪,当newElement做没有实现任何有用的接口(除了将它强制转换为你所期望的)。但这将是一个不同的问题...

+0

好吧我明白了,谢谢你。 'Updatable'是我模型中几个类遵循的协议,它们都有自己的协议方法实现,所以它们都实现了“有用的接口”。这听起来是对的还是有最佳做法,你可以分享? – Herakleis

相关问题