- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试比较一个类的两个实例的属性。我以前用过它并且工作正常:
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
上同时实现 Equatable
和 Hashable
,这样它就变成了一个干净的比较方法在 Equatable
端(只比较那里的哈希值)。
这种方式会产生更好的可维护性和更清晰的代码。另见 separation of concerns模式。
关于ios - 比较 Any 类型的两个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49447077/
我是一名优秀的程序员,十分优秀!