gpt4 book ai didi

swift - ReSwiftRecorder 添加具有属性的操作

转载 作者:行者123 更新时间:2023-11-28 06:27:10 25 4
gpt4 key购买 nike

最近在用ReSwift API,也想加入ReSwiftRecorder!ReSwiftRecorder in Github的样本是非常简单的应用程序

我需要做一些更复杂的事情。我有一个从服务器获取数据的对象,我需要它在应用程序未连接到网络时重新加载其数据。这是我的代码:

应用状态:

struct AppState: StateType {
var menus: Result<[Menu]>?
}

菜单缩减器:

func menusReducer(state: Result<[Menu]>?, action: Action) -> Result<[Menu]>? {
switch action {
case let action as SetMenusAction:
return action.menus
default:
return state
}
}

AppReducer:

struct AppReducer: Reducer {

func handleAction(action: Action, state: AppState?) -> AppState {
return AppState(
menus: menusReducer(state: state?.menus, action: action),
)
}
}

菜单操作:

struct SetMenus: Action {
let menus: Result<[Menu]>
}

我知道我需要将 MenuAction 更改为如下所示:

let SetMenusActionTypeMap: TypeMap = [SetMenusAction.type: SetMenusAction.self]

struct SetMenusAction: StandardActionConvertible {

static let type = "SET_MENU_ACTION"
let menus: Result<[Menu]>

init() {}
init(_ standardAction: StandardAction) {}

func toStandardAction() -> StandardAction {
return StandardAction(type: SetMenusAction.type, payload: [:], isTypedAction: true)
}

}

但是我在初始化函数时遇到了错误

Return from initializer without initializing all stored properties

当我设置初始化代码时,错误消失了,但应用程序没有恢复保存的数据!我该如何解决?

最佳答案

您需要添加序列化/反序列化代码。需要设置 menus 属性。此外,您需要将该属性序列化为 payload:

let SetMenusActionTypeMap: TypeMap = [SetMenusAction.type: SetMenusAction.self]

struct SetMenusAction: StandardActionConvertible {

static let type = "SET_MENU_ACTION"
let menus: Result<[Menu]>

init() {
self.menus = // however you initialize that
}
init(_ standardAction: StandardAction) {
let maybeMenus = standardAction.payload["menus"] as? [Menu]?
self.menus = // create Result from Optional<[Menu]>
}

func toStandardAction() -> StandardAction {
let maybeMenus = self.menus.asOptional // Cannot serialize Result itself
return StandardAction(type: SetMenusAction.type, payload: ["menus" : maybeMenus], isTypedAction: true)
}

}

所以我在这里看到的问题是:JSON 序列化取决于有效负载数据的字典表示,即对象的属性。 Result可以直接序列化吗?我猜不是,所以你需要将它转换为 nil。

总而言之,有效载荷是您错过的关键,现在您必须弄清楚如何将它与您手头的数据一起使用。此外,这让我有点怀疑结果类型本身是 AppState 的一部分。我希望在调度操作之前减少或处理它,例如 SettingMenusFailedAction 而不是 ChangeMenusAction(result:) 或类似的。正如旁注: Action 不应该只是类型化的属性 setter 。

关于swift - ReSwiftRecorder 添加具有属性的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41520168/

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