2017-03-17 8 views
0

私はSwift 3での作業中に直面していたソートの問題があります。次のように、Feedというオブジェクトが多数ある配列があります。 ソート方法には2つのステップが含まれていなければなりません: - 同じバーコードを持つオブジェクトが配列内に並んで表示されます - ステータスがAの同じバーコードを持つオブジェクトが左に、次が1になりますステータスBを持つもの、次にステータスCのもの。Swiftで2つのソート方法を組み合わせる方法は?

これらの2つのステップをカバーするソート機能を書く方法は?

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

@スルタン:Ops my bad。私はコードを編集しました –

答えて

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を使用することができます。しかし、Swiftにブリッジされていないので、キャスティングマジックが必要です。

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

こんにちは@Apurv、私はSwift 3でのソートに取り組んでいる初心者です。コンパレータメソッドで2つのオブジェクトを受け取る例を教えてください。ありがとう –

関連する問題