【发布时间】:2019-11-24 13:56:11
【问题描述】:
我为 Swift 制作了一个状态引擎,但有一些东西我想以显着的方式改进。
这是一个开源项目,你可以在这里查看:https://github.com/mrtksn/SwiftyState
我想改进的是处理状态变化的方式。
现在,状态变化是这样处理的:
let subscription = SwiftyState().subscribe { [weak self] in
let state = $0 as! MyStore
let oldState = $1 as? MyStore
/// Your code goes here
}
您订阅状态更改,并且每当调用某个操作并完成更改状态时,都会调用订阅者并传递旧状态和新状态。 state 是一个结构体。
由于每次状态更改时都会运行它,因此用户需要检查状态更改是否与代码的那部分相关。如果看起来像这样:
let subscription = SwiftyState().subscribe { [weak self] in
let state = $0 as! MyStore
let oldState = $1 as? MyStore
if state.userName != oldState.userName {
self?.nameLabel.text = state.userName
}
}
我想要的是用更少的代码做到这一点,也许是这样的:
let subscription = SwiftyState().subscribe { [weak self] in
let state = $0 as! MyStore
let oldState = $1 as? MyStore
/// Maybe assinging a closure to run when the state is changed
state.userName.hasChanged = {
self?.nameLabel.text = state.userName
}
/// Or maybe just tagging a property as changed
if state.userName.hasChanged {
self?.nameLabel.text = state.userName
}
/// Or maybe having a list of changes in the state object
if state.changes.contain("nameLabel") {
self?.nameLabel.text = state.userName
}
}
我考虑过创建一个扩展程序,但到目前为止我的成功有限。我有一些想法,但我遇到了一些导致结果不理想的问题。
也许 StackOverflow 的创造力或 Swift 方面的专业知识可以帮助我减少这里的样板代码?
有什么想法吗?
【问题讨论】:
标签: swift functional-programming frameworks swift-extensions