我有一个通用类型
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
?
答案 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]))
会产生
你好
你好,收藏
你好
您好,收藏