Swift:检查来自同一类的 2 个对象是不是具有不同的值?

Posted

技术标签:

【中文标题】Swift:检查来自同一类的 2 个对象是不是具有不同的值?【英文标题】:Swift: checking 2 object from same class have different values?Swift:检查来自同一类的 2 个对象是否具有不同的值? 【发布时间】:2020-08-24 19:45:55 【问题描述】:

我在我的项目中使用 swift。我有 2 个来自同一类的对象(例如来自 MyClass 类的对象 A 和对象 B):

class MyClass: NSObject 
    var someString: String = ""
    var someInt: Int = 0

...
let A = MyClass()
A.someString = "A object"
A.someInt = 1

let B = MyClass()
B.someString = "B object"
B.someInt = 2

我如何检查相同的属性是否具有相同的值,如果不是,则返回属性的值和键?

我认为我们可以通过在彼此内部使用带有 2 个 for 循环的 Mirror 来做到这一点,我在写吗?

【问题讨论】:

您需要为任何班级或仅针对特定班级这样做吗? 特定类 所以您可以简单地在函数中执行if a.someString != b.someString return ("someString", a.someString) 之类的操作? 我使用了一些简单的类(只有 2 个属性),想象一个有 20 个属性的类。那我该怎么办? 是的,但是你需要为每个属性编写特定的代码,我觉得你不想这样做。 【参考方案1】:

我认为您正在寻找类似的东西:

import Foundation

class MyClass 
    var someString: String = ""
    var someInt: Int = 0


let a = MyClass()
a.someString = "A object"
a.someInt = 1

let b = MyClass()
b.someString = "B object"
b.someInt = 2

func compare<T: MyClass>(_ instance: T, with instance2: T) -> [String: AnyHashable] 
    let sourceMirror = Mirror(reflecting: instance)
    let targetMirror = Mirror(reflecting: instance2)
    
    var output = [String: AnyHashable]()
    
    for sourceChild in sourceMirror.children 
        guard let label = sourceChild.label else  continue 
        
        guard let targetChild = (targetMirror.children.first  $0.label! == label ) else 
            fatalError("Failed to find target child, since types are same this fatal error should not be fired")
        
        
        guard
            let firstValue = sourceChild.value as? AnyHashable,
            let secondValue = targetChild.value as? AnyHashable
        else 
            continue
        
        
        guard firstValue != secondValue else  continue 
        
        output[label] = secondValue
    
    
    return output


for result in compare(a, with: b) 
    print("label: \(result.key), value: \(result.value)")

这种方法的缺点是你的所有字段都必须符合 Hashable 协议才能看到它们之间的区别。

输出是:

label: someInt, value: 2
label: someString, value: B object

【讨论】:

以上是关于Swift:检查来自同一类的 2 个对象是不是具有不同的值?的主要内容,如果未能解决你的问题,请参考以下文章

VBA检查来自2个字段的不同值是不是匹配

如何检查对象是不是具有存储属性?

在 Swift 中检查 2 个固定大小的数组是不是相等的最快方法是啥?

如何检查麦克风和扬声器是不是来自同一声卡?

检查2个坐标是不是在同一个城市

检查2个地址是不是在同一位置/区域[关闭]