【问题标题】:Sorting dateStrings in Swift with blank Strings在 Swift 中使用空白字符串对日期字符串进行排序
【发布时间】:2018-03-20 05:53:06
【问题描述】:

我正在尝试按日期对一组自定义对象进行排序,但日期以字符串形式存储在 .medium dateStyle 中。但是,一些对象也有一个空字符串作为它们的日期。

如何仍然对日期为空的数组进行排序?

这是我的代码:

let objA = testObj(dateProp: "Mar 13, 2018")
let objB = testObj(dateProp: "Apr 13, 2018")
let objC = testObj(dateProp: "Apr 12, 2018")
let objD = testObj(dateProp: "")

let arr: [testObj] = [objA, objB, objC]

let sortedArr = arr.sorted(by: { DateHandler.shared.convertStringToDate(string: $0.dateProp)?.compare(DateHandler.shared.convertStringToDate(string: $1.dateProp)!) == .orderedDescending })

print(sortedArr)

DateHandler.shared.convertStringtoDate 只是将字符串转换为日期,但强制解包可选会导致代码在出现空白字符串而不是日期时中断。

【问题讨论】:

  • 为什么那个日期有一个空字符串?那意味着什么?今天的日期 ?根本没有日期?
  • 为什么要添加空白字符串有什么需要呢?我不明白。你能描述一下吗?
  • 为什么日期存储为字符串?为什么要使用空字符串?将日期属性设为可选。
  • @Nitish 如果我有一个商店列表和访问它们的日期,但随后我添加了一个我还没有访问过的商店,那么日期将是一个空字符串
  • @rmaddy 如果该属性是可选的并且不存在,那么 compare() 函数在这种情况下是否仍然有效?

标签: ios swift swift4


【解决方案1】:

只是扩展排序闭包

let sortedArr = arr.sorted { (first, second) -> Bool in
    let dateFormatter = DateFormatter()

    guard let firstDate = dateFormatter.date(from: first.dateProp) else {
        return false
    }
    guard let secondDate = dateFormatter.date(from: second.dateProp) else {
        return true
    }
    return firstDate < secondDate
}

【讨论】:

  • 感谢您提供此解决方案。这会将没有 dateProp 的对象放在哪里?
  • 在数组的开头
【解决方案2】:

这里是解决方案谢谢tereks

let sortedArr = arr.sorted { (first, second) -> Bool in

            guard let firstDate = convertStrDateToDate(first.dateProp) else {
                return false
            }
            guard let secondDate = convertStrDateToDate(second.dateProp) else {
                return true
            }
            return firstDate < secondDate
        }

将字符串日期转换为日期

func convertStrDateToDate(_ date:String) -> Date? {
        let inputFormatter = DateFormatter()
        inputFormatter.timeZone = NSTimeZone.local
        inputFormatter.dateFormat = "MMM dd, yyyy"

        let date = inputFormatter.date(from: date)
        return date
    }

输出

2018 年 3 月 13 日

2018 年 4 月 12 日

2018 年 4 月 13 日

【讨论】:

    猜你喜欢
    • 2016-04-04
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2013-01-18
    • 2021-12-18
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多