【发布时间】:2018-03-23 10:06:16
【问题描述】:
我正在尝试比较一个类的两个实例的属性。我以前用过它,它工作正常:
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
我将不胜感激!
【问题讨论】:
-
isEqual用于许多函数,因此它被频繁调用并且应该尽可能高效。你这种伪泛型是不必要的昂贵。 -
感谢您的提示。你知道实现我想做的另一种方法吗?