快速扩展中的通用替代没有被调用

时间:2019-05-14 09:57:34

标签: swift generics override

我有一个通用类型

enum ResultState<T> {
    case found(T)
}

带有一些扩展名

extension ResultState {

    func hello() { print("Hello") }
}

extension ResultState where T: Collection {

    func hello() { print("Hello, collection") }
}

这些功能完美且完全符合我的期望:

ResultState.found(1).hello() // prints "Hello"
ResultState.found([1]).hello() // prints "Hello, collection"

但是,如果从另一个泛型函数中调用它们,则它们的行为会不同

func myFunction<T>(_ state: ResultState<T>) {
    state.hello()
}

例如,

myFunction(ResultState.found(1)) // prints "Hello"
myFunction(ResultState.found([1]) // prints "Hello"

现在,即使检查T中的myFunction肯定是Array<Int>,每次都会调用hello的基本版本。

这是Swift的预期行为吗?

如果是这样,我将如何解决-如何从hello中调用正确版本的myFunction

1 个答案:

答案 0 :(得分:1)

在我看来,该信息对于myFunction丢失了,仅向下应用了一层,可以说是ResultState。不确定这是否是您想要的解决方案,但是一种方法是用具有不同扩展名的相同方式定义不同的功能。

func myFunction<T: Collection>(_ state: ResultState<T>)  {
    state.hello()
}

func myFunction<T>(_ state: ResultState<T>)  {
    state.hello()
}

执行

ResultState.found(1).hello() 
ResultState.found([1]).hello() 

myFunction(ResultState.found(1))
myFunction(ResultState.found([1]))

会产生

  

你好
  你好,收藏
  你好
  您好,收藏