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

时间:2019-07-15 20:42:28

标签: swift functional-programming frameworks swift-extensions

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

有什么想法吗?

1 个答案:

答案 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