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的.
您需要使方法本身通用,并使用type参数作为"normal"参数的类型.然后,您还可以限制第一种类型的关联类型.例如:
func blah<T>(stuff: T) where T : Sequence, T.Iterator.Element : Stuff
Run Code Online (Sandbox Code Playgroud)
表示stuff必须是Sequence其元素类型符合或继承的元素Stuff.