排序数组的结果是意外的

时间:2017-04-22 15:29:17

标签: ios swift

我有一个包含日期值的对象数组。我已计算出日期差异并返回剩余天数。现在我正在尝试对其进行排序,以便根据剩余天数最少的对象进行追加。

我已经能够使用这个功能了:

func sortList() {
    item.sort { (first: Item, second: Item) -> Bool in
        return first.days() < second.days()
    }
} 

这给了我这个:

this

但是你可以看到底部附加了等于0的日期。

这就是我计算天差的方法:

func daysDiff(startDate: Date, endDate: Date) -> Int {
    let calendar = Calendar.current

    let date1 = calendar.startOfDay(for: startDate)
    let date2 = calendar.startOfDay(for: endDate)

    let a = calendar.dateComponents([.day], from: date1, to: date2)
    return a.value(for: .day)!
}

这就是我格式化它的方式:

func days() -> String {
    let formatter = DateFormatter()

    formatter.dateFormat = "MM dd, yyyy"
    let date = formatter.date(from: itemDate!)

    let date1 = Date()
    let date2 = date
    let days = daysDiff(startDate: date1, endDate: date2!)
    if days > 1 {
        return "\(days) days left"
    } else if days == 1 {
        return "a day left"
    } else if days == 0 {
        return "Due today!"
    } else if days < 0 {
        return "Late"
    } else {
        return "\(days)"
    }
}

我不确定为什么会出现这个问题。

1 个答案:

答案 0 :(得分:3)

您的排序基于days()函数中的文本,因此您可以根据文本的字母顺序对数据进行排序。您应该根据实际的整数值排序,而不是字符串。

你班上应该有两种方法。

  1. days()返回Int而不是String
  2. daysLabel根据String的结果返回days
  3. 按编号排序时使用days。在某处显示daysLabel实例时使用Item

    func days() -> Int {
        let formatter = DateFormatter()
    
        formatter.dateFormat = "MM dd, yyyy"
        let date = formatter.date(from: itemDate!)
    
        let date1 = Date()
        let date2 = date
        let days = daysDiff(startDate: date1, endDate: date2!)
    
         return days
    }
    
    func daysLabel() -> String {
        let days = days()
    
        if days > 1 {
            return "\(days) days left"
        } else if days == 1 {
            return "a day left"
        } else if days == 0 {
            return "Due today!"
        } else if days < 0 {
            return "Late"
        } else {
            return "\(days)"
        }
    }