2017-03-17 40 views
0

这是我在Swift 3上工作时遇到的排序问题。我有一个名为Feed的多个对象的数组,如下所示。 排序方法应包括2个步骤: - 具有相同条形码的对象将并排排列在阵列中 - 具有状态A的相同条形码的对象将位于左侧,下一个是状态为B,则状态为C.如何在Swift中结合两种排序方法?

如何编写一个排序函数来覆盖这两个步骤?

class Feed: Object { 

    dynamic var barcode: Int 
    dynamic var feed_type = "" 

    dynamic var status: String 

    override class func primaryKey() -> String { 
     return "id" 
    } 

    var type: FeedType { 
     get { 
      return FeedType.get(feed_type) 
     } 

     set(newValue) { 
      feed_type = newValue.key 
     } 
    } 

} 
+0

@Sulthan:Ops我的坏。我编辑了代码 –

回答

1

你可以简单的环比上升的比较:

let values: [Feed] = ... 

let sortedValues: [Feed] = values.sorted { (feed1, feed2) in 
    feed1.barcode < feed2.barcode 
    || (feed1.barcode == feed2.barcode && feed1.status < feed2.status) 
} 

由于您使用的Objective-C对象,你也可以使用旧NSSortDescriptor。然而,它没有桥接斯威夫特因此,你需要一些神奇的铸造:

let barcodeSortDescriptor = NSSortDescriptor(key: "barcode", ascending: true) 
let statusSortDescriptor = NSSortDescriptor(key: "status", ascending: true) 

let sortedValues: [Feed] = (values as NSArray) 
    .sortedArray(using: [barcodeSortDescriptor, statusSortDescriptor]) as! [Feed] 

这是特别有用当你的排序是比较复杂的。

1

所以在你的比较器方法中,你应该接收2个对象。现在做下面的事情。

if(object1.barcode > object2.barcode) 
    return false; 
else if(object1.barcode < object2.barcode) 
    return true; 
else { 
    if(object1.status > object2.status) 
     return false; 
    else 
     return true; 
} 
+0

hi @Apurv,我是一个在Swift 3中进行排序的新手。你能举一个在比较方法中接收2个对象的例子吗?谢谢 –