gpt4 book ai didi

协议(protocol)子类型的 Swift 协议(protocol)一致性问题

转载 作者:行者123 更新时间:2023-12-04 15:22:06 76 4
gpt4 key购买 nike

internal protocol Reducer {
associatedtype S : BaseState
associatedtype A : BaseAction

func reduce(state: S, action: A) -> S
}

internal class ReducerImpl : Reducer {
func reduce(state: MainState, action: MainAction) -> MainState { //<-- Error because MainAction is a protocol not a concrete one.
return state
}
}

internal class MainState : BaseState {}
internal protocol MainAction : BaseAction {}

internal protocol BaseState {}
internal protocol BaseAction {}

如果我将 MainAction 从协议(protocol)更改为类,编译错误就会消失。

我搜索了很多文章来了解这个错误,但都失败了。

我是否必须在 reduce(...) 函数中传递一个具体参数(例如枚举、类、结构)?

我想让 ReducerImpl 可以采取符合 MainAction 的各种 Action 类型。

有没有人可以给我解释一下这个错误以及为什么 Swift 采用这种规则。

最佳答案

associatedtype 必须是具体的,即。 类型 而不是协议(protocol)

您可以做的是使用接受 MainAction 参数的通用函数创建一个更窄的协议(protocol):

internal protocol MainReducer {
associatedtype State
func reduce<Action>(state: State, action: Action) -> State where Action: MainAction
}

internal class ReducerImpl: MainReducer {
func reduce<Action>(state: MainState, action: Action) -> MainState where Action: MainAction {
return state
}
}

关于协议(protocol)子类型的 Swift 协议(protocol)一致性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63077568/

76 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com