gpt4 book ai didi

ios - 比较 Any 类型的两个属性

转载 作者:可可西里 更新时间:2023-11-01 00:55:34 25 4
gpt4 key购买 nike

我正在尝试比较一个类的两个实例的属性。我以前用过它并且工作正常:

override public func isEqual(_ object: Any?) -> Bool {
if let rhs = object as? BankDataModel, self.accountHolderName == rhs.accountHolderName, self.accountNumber == rhs.accountNumber,
self.accountHolderThirdPartyAccountOwner == rhs.accountHolderThirdPartyAccountOwner, self.bankName == rhs.bankName, self.bankRoutingNumber == rhs.bankRoutingNumber, self.bic == rhs.bic, self.iban == rhs.iban, self.directDebitStatus == rhs.directDebitStatus, self.sepaCreditorID == rhs.sepaCreditorID, self.sepaMandateID == rhs.sepaMandateID{
return true
}else{
return false
}
}

但是,如果我想使用它,我必须再次为我的所有模型类编写它。我想要一个可以用于所有模型类的函数,所以我使用了 Mirror 结构并尝试了如下操作:

 override public func isEqual(_ object: Any?) -> Bool {
if let rhs = object as? BankDataModel{
return compareTwoObjects(objectToCompare: rhs, objectSelf: self)
}else{
return false
}
}

每个模型中重写的 isEqual 方法将从 Helper 类调用此方法,因此我可以在我拥有的每个模型中使用它:

func compareTwoObjects(objectToCompare: Any, objectSelf: Any) -> Bool{
let objectSelf2 = Mirror(reflecting: objectSelf)
let objectToCompare2 = Mirror(reflecting: objectToCompare)
var index = objectToCompare2.children.startIndex
for attr in objectSelf2.children{
let type1 = Mirror(reflecting: attr.value).subjectType
print(type1)
let type2 = Mirror(reflecting: objectToCompare2.children[index].value).subjectType
print(type2)
if type1 == type2{
print("Equal")
if attr.value as! type1 != objectToCompare2.children[index].value as! type2{
return false
}
}
index = objectToCompare2.children.index(index, offsetBy: 1)
}
return true
}

大部分代码工作正常,print("Equal")总是在两个变量的类型相等时执行。问题是这一行:

if attr.value as! type1 != objectToCompare.children[index].value as! type2{
return false
}

我收到此错误消息:“使用未声明的类型“type1””。如果我不对 type1 和 type2 使用强制转换,我会得到一个错误,即我不能将 == 与两个“Any”类型的属性一起使用。有没有办法将 type1 和 type2 字符串转换为实际数据类型?或者是否有更好的方法来实现我想要实现的目标?

这是我的打印输出:

Optional<String>
Optional<String>
Equal
Optional<String>
Optional<String>
Equal
Optional<Bool>
Optional<Bool>
Equal
String
String
Equal
Optional<String>
Optional<String>
Equal
String
String
Equal
String
String
Equal
Optional<DirectDebitStatus>
Optional<DirectDebitStatus>
Equal

如有任何帮助,我将不胜感激!

最佳答案

swift 4

我认为您可能想要使用 Equatable 接口(interface)。有了它你可以实现这样的目标:

extension BankDataModel: Equatable {
static func == (lhs: BankDataModel, rhs: BankDataModel) -> Bool {
return
lhs.accountHolderName == rhs.accountHolderName &&
lhs.accountNumber == rhs.accountNumber &&
lhs.accountHolderThirdPartyAccountOwner == rhs.accountHolderThirdPartyAccountOwner
}
}

注意:您可以使用额外的 && 子句扩展 return 语句以增加“相等”检查。

然后无论你把这个扩展放在哪里,你都可以使用 == 运算符将两个 BankDataModel 相互比较,如下所示:

let bankAModel: BankDataModel = // Some model
let bankBModel: BankDataModel = // Also some model

if bankAModel == bankBModel {
// Do stuff
}

扩张

我能想到的最好的情况是在 BankDataModel 上同时实现 EquatableHashable,这样它就变成了一个干净的比较方法在 Equatable 端(只比较那里的哈希值)。

这种方式会产生更好的可维护性和更清晰的代码。另见 separation of concerns模式。

关于ios - 比较 Any 类型的两个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49447077/

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