gpt4 book ai didi

swift - 在 Swift 中优雅地检查两个结构体实例是否不同

转载 作者:行者123 更新时间:2023-11-30 10:39:56 25 4
gpt4 key购买 nike

我为 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 的专业知识可以帮助我减少这里的样板代码?

有什么想法吗?

最佳答案

要比较 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 个结构,例如,

let s1 = MyStruct(userName: "John")
let s2 = MyStruct(userName: "Annie")
if s1 == s2 {
print("Equal")
} else {
print("Unequal")
}

您的自定义类型同样有效,即

关于swift - 在 Swift 中优雅地检查两个结构体实例是否不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57046934/

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