2017-12-07 29 views
1

私は最後の更新時にソートする必要のある会話のリストを持っています。私はこれを行うことができますが、今私はまた、ユーザーが会話に含まれていない場合は、それがリストの最後に表示される必要がありますチェックを追加する必要があります。最後に配列の一部のオブジェクトをスワイプで移動3

func sortConversationList() { 
self.conversationList = self.conversationList.sorted(by: { $0.lastupdatedTime! > $1.lastupdatedTime! }) 
    for (index, conversation) in self.conversationList.enumerated() { 
     if (conversation.isIncluded == kNo) { 
      self.conversationList.move(at: index, to: self.conversationList.endIndex-1) 
     } 
    } 
    self.tableView.reloadData() 
} 
mutating func move(at oldIndex: Int, to newIndex: Int) { 
     self.insert(self.remove(at: oldIndex), at: newIndex) 
    } 

しかし、これは正しく動作しません。迅速にこれを行うためのより良い方法はありますか?

+1

は、ソートの途中で、あなたのソートリストを変異さ...む〜ソートが機能している – Alexander

答えて

2

あなたのアプローチは非常に複雑です。次の2つの並べ替えの基準を持っている:

  1. isIncluded - true値はfalse値、
  2. lastupdatedTime前にソートされなければならない - より大きな値は、最初にソートする必要があります。
  3. 単一 sort()コールを用いて行うことができる

conversationList.sort(by: { 
    if $0.isIncluded != $1.isIncluded { 
     return $0.isIncluded 
    } else { 
     return $0.lastupdatedTime > $1.lastupdatedTime 
    } 
}) 

これはisIncludedは(賢明であろう)ブール変数であると仮定。それは整数(あなたがコメントで示されているように) である場合、それはさらに簡単です:(Swift - Sort array of objects with multiple criteriaを比較):

conversationList.sort(by: { 
    ($0.isIncluded, $0.lastupdatedTime) > ($1.isIncluded, $1.lastupdatedTime) 
}) 
+0

細かいが時々isIncluded真の値は、一番上の、そして時には偽の値になります。最初のif条件を "if $ 0.isIncluded!= $ 1.isIncluded && $ 0.isIncluded!== false"に更新し、うまくいきませんでした。 : - | –

+0

trueの代わりにisIncludedの値が1,0であると考えてください。 1の値は上部に、0の値は下部にある必要があります。 –

+0

@aqsaarshad: 'isIncluded'はどのようなタイプですか? 'isIncluded1'とは何ですか? –

関連する問題