2017-07-30 158 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) 
相关问题