我为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
}
您订阅状态更改,每当调用操作并完成更改状态时,就会调用订阅者,并传递旧状态和新状态。状态是一个结构。
由于状态更改每次都会运行一次,因此用户需要检查状态更改是否与代码的这一部分相关。如果看起来像这样:
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的专业知识可以帮助我在这里减少样板?
有什么想法吗?
答案 0 :(得分:0)
要在Swift中比较自定义类型,请将其与 Equatable protocol
一致,并实现其public static func == (lhs: Self, rhs: Self) -> Bool
方法。
这里是如何执行此操作的示例。由于尚未添加MyStore
的定义,因此您也可以在其中实现相同的操作。
struct MyStore: Equatable {
var userName: String
static func == (lhs: MyStruct, rhs: MyStruct) -> Bool {
return lhs.userName == rhs.userName
}
}
在上述方法中,添加所有要比较MyStruct
实例的属性。目前,我仅使用userName
进行比较。
比较2个structs
喜欢
let s1 = MyStruct(userName: "John")
let s2 = MyStruct(userName: "Annie")
if s1 == s2 {
print("Equal")
} else {
print("Unequal")
}
与您的自定义类型一样有效的是class
。