Swift 斯威夫特:如何投出任何可比的?
我想写一个函数来比较两个对象的属性名Swift 斯威夫特:如何投出任何可比的?,swift,Swift,我想写一个函数来比较两个对象的属性名 func compareTwoObj(obj1, obj2, propertyName) -> ComparisonResult { let value1 = getPropertyOfObj(obj1, propertyName) let value2 = getPropertyOfObj(obj2, propertyName) if let v1 = value1 as? Int, let v2 = value2 as?
func compareTwoObj(obj1, obj2, propertyName) -> ComparisonResult {
let value1 = getPropertyOfObj(obj1, propertyName)
let value2 = getPropertyOfObj(obj2, propertyName)
if let v1 = value1 as? Int, let v2 = value2 as? Int {
return self.compareValues(v1: v1, v2: v2)
}
else if let v1 = value1 as? String, let v2 = value2 as? String {
return self.compareValues(v1: v1, v2: v2)
}
else if let v1 = value1 as? Double, let v2 = value2 as? Double {
return self.compareValues(v1: v1, v2: v2)
}
else if let v1 = value1 as? Float, let v2 = value2 as? Float {
return self.compareValues(v1: v1, v2: v2)
}
else {
return .orderedSame
}
}
func compareValues<T: Comparable> (v1: T, v2: T) -> ComparisonResult {
let obj1 = v1
let obj2 = v2
if obj1 > obj2 {
return .orderedDescending
}
else if obj1 < obj2 {
return .orderedAscending
}
else {
return .orderedSame
}
}
除非
compareTwoObj
也是泛型的,并使您指定字符串名称所期望找到的属性的确切类型,否则您无法真正做到这一点
Comparable
并不意味着“类型为t
的对象可以与任何对象进行比较”。具体地说,它意味着“可以将T
类型的对象与T
类型的其他对象进行比较”。如果不知道value1
和value2
是相同的类型,则无法满足compareValues
的签名,这要求v1
和v2
具有相同的类型t
func compare<T>(
obj1: T,
to obj2: T,
byPropertyNamed propertyName: String,
ofType: T.Type
) -> ComparisonResult {
guard
let value1 = getPropertyOfObj(obj1, propertyName) as? T,
let value2 = getPropertyOfObj(obj2, propertyName) as? T
else { fatalError("Type error!") }
return compare(value1, value2)
}
func compare<T: Comparable>(_ obj1: T, _ obj2: T) -> ComparisonResult {
if obj1 > obj2 {
return .orderedDescending
} else if obj1 < obj2 {
return .orderedAscending
} else {
return .orderedSame
}
}
func比较(
obj1:T,
到obj2:T,
byPropertyNamed propertyName:String,
类型:T.类型
)->比较结果{
警卫
设value1=getPropertyOfObj(obj1,propertyName)为?T,
让value2=getPropertyOfObj(obj2,propertyName)作为?T
else{fatalError(“Type error!”)}
返回比较(值1、值2)
}
函数比较(uobj1:T,uobj2:T)->比较结果{
如果obj1>obj2{
return.orderedDescending
}否则,如果obj1
compareValues函数的作用是什么?不要强制转换为Comparable,而是约束为Comparable。您应该使用泛型和本机键路径。您还可以通过使用强类型键路径而不是字符串来解决此问题。
func compare<T>(
obj1: T,
to obj2: T,
byPropertyNamed propertyName: String,
ofType: T.Type
) -> ComparisonResult {
guard
let value1 = getPropertyOfObj(obj1, propertyName) as? T,
let value2 = getPropertyOfObj(obj2, propertyName) as? T
else { fatalError("Type error!") }
return compare(value1, value2)
}
func compare<T: Comparable>(_ obj1: T, _ obj2: T) -> ComparisonResult {
if obj1 > obj2 {
return .orderedDescending
} else if obj1 < obj2 {
return .orderedAscending
} else {
return .orderedSame
}
}