我有一个包含日期值的对象数组。我已计算出日期差异并返回剩余天数。现在我正在尝试对其进行排序,以便根据剩余天数最少的对象进行追加。
我已经能够使用这个功能了:
func sortList() {
item.sort { (first: Item, second: Item) -> Bool in
return first.days() < second.days()
}
}
这给了我这个:
但是你可以看到底部附加了等于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)"
}
}
我不确定为什么会出现这个问题。
答案 0 :(得分:3)
您的排序基于days()函数中的文本,因此您可以根据文本的字母顺序对数据进行排序。您应该根据实际的整数值排序,而不是字符串。
你班上应该有两种方法。
days()
返回Int
而不是String
。daysLabel
根据String
的结果返回days
。按编号排序时使用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)"
}
}