2017-07-30 85 views
0

我目前有一個元組數組,其第一個值的類型爲String,第二個值的類型爲Double。第一個值包含日期,格式爲"MM/dd/yy"。我不使用Date對象由於我的代碼中的衝突。對Swift 3中包含日期的字符串數組進行排序?

由於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

排序日期字符串是醜陋和繁瑣。認爲面向對象的,而不是元組使用一個自定義的結構或類與存儲的日期(是!)屬性和計算屬性的字符串表示。它使生活變得更容易。 – vadian

+0

@vadian我明白,但使用替代'日期'不適合我目前的實施...有更好的解決方案排序日期'字符串'然後只是切換到'日期'對象? – Pangu

+2

然後考慮改變你的實現。不要打架。 – vadian

回答

0

我建議你創建一個Object,它將使你的StringDouble成爲屬性。你可以將一個數據作爲一個計算的屬性,這個屬性將在字符串值上計算。並使用Date計算屬性進行排序。

我相信這會讓你的生活變得更輕鬆,並且重新將你的代碼從元組重新寫入對象。後來在排序字符串的時候很難找到bug。我確信你的第一個情況是當數組中有三個元組時,它只是一個巧合,它以正確的方式對它進行排序(這是一種猜測) ..

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) 
相關問題