Swift中X的通用集合?

adi*_*dib 2 generics swift swift3

我正在尝试制定一个委托协议,它可以接收X类型的对象集合.该协议的相同方法应该能够采用以下实例:

  • Set<X>
  • Array<X>
  • LazyMapCollection<Dictionary<_, X>, X>(最后一个来自Dictionary.values)

问题是,如何声明协议方法?

以下是一些不能正常工作的候选方法声明:

public protocol BlahDelegate : NSObjectProtocol {
    // won't compile; 'cannot specialize generic type "Sequence"'
    func blah(_ sender: Blah,foundStuff stuff: Sequence<Stuff>)

    // won't compile; 'cannot specialize generic type "Collection"'
    func blah(_ sender: Blah,foundStuff stuff: Collection<Stuff>)

    // this can't take in Set<Stuff> nor LazyMapCollection<Dictionary<_, Stuff>, Stuff>
    func blah(_ sender: Blah,foundStuff stuff: Array<Stuff>)

    // this can't take in Array<Stuff> nor LazyMapCollection<Dictionary<_, Stuff>, Stuff>
    func blah(_ sender: Blah,foundStuff stuff: Set<Stuff>)
}
Run Code Online (Sandbox Code Playgroud)

PS:这是针对Swift 3的.

Jos*_*ell 6

您需要使方法本身通用,并使用type参数作为"normal"参数的类型.然后,您还可以限制第一种类型的关联类型.例如:

func blah<T>(stuff: T) where T : Sequence, T.Iterator.Element : Stuff
Run Code Online (Sandbox Code Playgroud)

表示stuff必须是Sequence其元素类型符合或继承的元素Stuff.