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
    }
}