2017-07-30 8 views
0

私は現在、最初の値の型がStringで、2番目の値がDoubleのタプル配列を持っています。最初の値には日付が含まれ、形式は"MM/dd/yy"です。Swift 3で日付を含む文字列のタプル配列をソートする?

私はコードが矛盾しているためDateオブジェクトを使用していません。

MMのため、この配列を降順(最近から古いもの)で並べ替えることができません。

[("07/30/17", 5.0), ("08/30/17", 9.0), ("05/30/17", 5.0), ("05/28/17", 6.0)] 

tupleArray = tupleArray.sort({$0.0 > $1.0})は以下を生成する呼び出し:例えば、私の配列は、以下が含まれてい

[("08/30/17", 9.0), ("07/30/17", 5.0), ("05/30/17", 5.0), ("05/28/17", 6.0)] 

期待通りに動作します。しかし

、私はStringエントリ"08/30/16"を追加した場合、同じ種類の関数を呼び出すと、以下を生成します。

[("08/30/17", 9.0), ("08/30/16", 30.0), ("07/30/17", 5.0), ("05/30/17", 5.0), ("05/28/17", 6.0)] 

"08/30/16"それが最後のインデックスであるべきとき年16が古いため、第二のインデックスであります17

私が見てきた:

  1. (Swift 3) Trying to sort an array of class objects by Date in swift 3?

  2. Sort Objects in Array by date

私が間違って何をしているのですか?

ありがとうございます!

+0

日付文字列をソートするのは面倒で面倒です。タプルの代わりに、格納された 'Date'(yes!)プロパティと文字列表現の計算されたプロパティを持つカスタム構造体またはクラスを使用するオブジェクト指向を考えてください。人生はずっと楽になります。 – vadian

+0

@vadian私は理解していますが、代わりの 'Date'を使っても私の現在の実装ではうまくいきません。' Strings'を並べ替えて 'Date'オブジェクトに切り替えるより良い解決策がありますか? – Pangu

+2

次に、実装を変更することを検討してください。フレームワークと戦わないでください。 – vadian

答えて

0

StringDoubleをプロパティとして持つObjectを作成することをお勧めします。また、String値で計算される計算されたプロパティとしてDataを作成することもできます。計算されたプロパティDateを使用してソートを行います。

これはあなたの人生をはるかに簡単にし、コードをタプルからオブジェクトに書き直すことができると確信しています。その後、文字列をソートする際にバグを見つけるのは本当に難しいでしょう。配列に3つのタプルがあった最初のケ​​ースは、それが正しい方法でソートされたことだけです(これは推測です) ..

1
import Foundation 

var tupleArray = [("08/30/17", 9.0), ("08/30/16", 30.0), ("07/30/17", 5.0), ("05/30/17", 5.0), ("05/28/17", 6.0)] 

let dateFormatter = DateFormatter() 
dateFormatter.dateFormat = "MM/dd/yy" 

tupleArray = tupleArray.sorted { 
    guard let date1 = dateFormatter.date(from:$0.0), let date2 = dateFormatter.date(from:$1.0) else { return false} 
    return date1 > date2 
} 

print(tupleArray) 
関連する問題