gpt4 book ai didi

swift - 是否可以在运行时在 Swift 中动态执行深度属性比较?

转载 作者:搜寻专家 更新时间:2023-11-01 06:06:06 24 4
gpt4 key购买 nike

假设我们有两个 UILabel 实例,它们对我们来说是等价的:

let label1 = UILabel()
label1.text = "Hello world"

let label2 = UILabel()
label2.text = "Hello world"

假设这两个实例位于 [UIView] 类型的数组中:

let views: [UIView] = [label1, label2]

有没有什么方法可以执行相等性检查,发现 UIView 的这两个实例是等价的,而无需提前知道它们是哪种类型(因此也不知道要比较哪些公共(public)属性)?

(任何使用这些实例都具有 UILabeldynamicType 并动态运行 UILabel< 的键/值属性的方法 分类并比较每个可以比较的值?)

发生了什么:

label1 == label2      // false
views[0] == views[1] // false

需要什么:

areTheSame(label1, label2)     // true
areTheSame(views[0], views[1]) // true

我们正在寻找一种方法来比较两个单独的实例,因此我们不能使用 ===

最佳答案

Swift 没有反射,所以这是不可能的。我们甚至无法获得属性列表。

另请注意,对于许多类型,没有相等性的定义。即使比较两个浮点值也是一个问题。

正是出于这个原因,我们有了 Equatable 协议(protocol)。如果要比较类型,请在它们上定义相等性。然后,这种平等可以根据需要深入,而不需要任何动态(不安全)行为。

只是为了解释另一个极端情况,例如,在 UILabel 上有一些您绝对不想比较的属性,即 nextResponder super View 。试图深入比较这些属性实际上会陷入循环。通常,如果不确切知道应该比较什么和不应该比较什么,就不可能比较两个对象是否相等。

关于swift - 是否可以在运行时在 Swift 中动态执行深度属性比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37033721/

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