Swift 是否可以使用动态属性跨兄弟类保存重复排序代码?

Swift 是否可以使用动态属性跨兄弟类保存重复排序代码?,swift,sorting,optimization,Swift,Sorting,Optimization,我有多个类,它们都继承自RootClass RootClass有一个class函数,返回该类所有实例的数组,称为fetchAll() 因此,要获得子类的所有实例的数组,代码应该是: let subclass1Array=SubClass1.fetchAll() 现在,我制作了一个自定义函数来包装这个数组,但是在返回之前对数组进行排序 let allSubObjects1 = try! SubClass1.fetchAll() let sortedSubObjects1 = allSubObjec

我有多个类,它们都继承自
RootClass

RootClass
有一个class函数,返回该类所有实例的数组,称为
fetchAll()

因此,要获得子类的所有实例的数组,代码应该是:
let subclass1Array=SubClass1.fetchAll()

现在,我制作了一个自定义函数来包装这个数组,但是在返回之前对数组进行排序

let allSubObjects1 = try! SubClass1.fetchAll()
let sortedSubObjects1 = allSubObjects1.sorted {
    if $0.prop1 == $1.prop1 {
        return $0.prop2 ?? "" < $1.prop2 ?? ""
    } else {
        return $0.prop1 ?? "" < $1.prop1 ?? ""
    }
}
return sortedSubObjects1
在理想情况下,我有一个函数,它接受N个属性数组进行排序,
[prop1,prop2]
[prop1,prop2,prop3]
,然后它只返回这些
根类
子类的排序数组

方法1(下面的代码):
  • 创建一个名为
    sortWeight
    的属性,每个类都可以有一个自定义实现
  • 因此,每个类都决定了它需要如何排序
方法2:
  • Keypath
    Swift
    相当于
    valueForKey
  • 参考:
根类: 甲级 援引:
if $0.prop1 == $1.prop1 {
    if $0.prop2 == $1.prop2 {
        return $0.prop3 ?? "" < $1.prop3 ?? ""
    } else {
        return $0.prop2 ?? "" < $1.prop2 ?? ""
    }
} else {
    return $0.prop1 ?? "" < $1.prop1 ?? ""
}
class RootClass : CustomStringConvertible {

    var prop1 : Int

    init(prop1: Int) {

        self.prop1 = prop1
    }

    var description: String {

        return String(prop1)
    }

    var sortWeight : Int {

        return prop1
    }
}
class ClassA : RootClass {

    var prop2 : Int

    init(prop1: Int, prop2: Int) {

        self.prop2 = prop2

        super.init(prop1: prop1)
    }

    override var sortWeight : Int {

        return (prop2 * 10 + prop1)
    }

    override var description: String {

        return "(\(prop1), \(prop2))"
    }
}
print("RootClass:")

var array : [RootClass] = [RootClass(prop1: 15), RootClass(prop1: 6), RootClass(prop1: 12)]

array.sort(by: { $0.sortWeight < $1.sortWeight })

print(array)

print("\nSubclass:")

array = [ClassA(prop1: 8, prop2: 3), ClassA(prop1: 4, prop2: 2)]

array.sort(by: { $0.sortWeight < $1.sortWeight })

print(array)
RootClass:
[6, 12, 15]

Subclass:
[(4, 2), (8, 3)]