【问题标题】:Sorting an array in date order causes crash on device按日期顺序对数组进行排序会导致设备崩溃
【发布时间】:2016-10-03 15:58:20
【问题描述】:

我有一个存储不同日期的数组:

var Dates_Array = [String]()

然后我有一个将字符串转换为 NSDate 的扩展:

    extension String{
    var StringToDate:NSDate {
        let df = NSDateFormatter()
        df.dateStyle = .LongStyle
        df.timeStyle = .NoStyle
        return (df.dateFromString(self))!
    }
}

这是对数组进行排序的代码:

self.Ordered_Dates_Array = self.Dates_Array.sort { ($0 ).StringToDate.compare(($1 ).StringToDate) == .OrderedAscending}

在模拟器中,所有这些代码都按预期工作。但是当我在设备上运行它时,应用程序崩溃了,这是错误消息的图像:

当我注释掉对数组进行排序的代码时,一切都按预期工作。那么是什么导致我的应用在设备上崩溃而不是在模拟器上崩溃?

编辑:

这就是 Dates_Array 的样子:

[“2016 年 12 月 24 日”、“2016 年 9 月 14 日”、“2016 年 9 月 19 日”、“2016 年 11 月 19 日”]

我的设备时区是伦敦。语言 = 英语,日历 = 公历。

【问题讨论】:

  • nil,你在某处有 nil,逐行查看,然后查看位置
  • 您的一个或多个字符串无法使用您的日期格式化程序转换为日期。顺便说一句 - 这种方法很少奏效,因为 dateStyle 对于每个区域设置都会有所不同,甚至基于用户在“设置”应用中所做的设置。
  • 那么为什么一个或多个字符串不能转换成日期呢?为什么这可以在模拟器上工作,但不能在设备上工作?如果所有日期都是长样式,那么它应该仍然有效吗?
  • 您需要使用您尝试转换的字符串样本来更新您的问题。您需要告诉我们您在导致问题的设备上使用的区域设置(国家和语言)。了解字符串是如何开始创建的也会有所帮助。
  • 在英国,长日期格式更像“2016 年 12 月 24 日”,而不是“2016 年 12 月 24 日”(更像是美国格式)。

标签: arrays swift sorting crash nsdate


【解决方案1】:

return (df.dateFromString(self))! 替换为:

if let dateString = df.dateFromString(self) {
    return dateString
} else {
    //Handle situations where the string can't be formatted as date
    return "Can't convert to date"
}

现在你可以知道哪个字符串不能转换了。

【讨论】:

  • 显然没有一个可以转换,但在模拟器中可以。
【解决方案2】:

所以问题是我的日期是在美国写的,但我设备上的地区设置为英国,它有不同的日期样式。感谢@rmaddy 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2016-09-30
    • 1970-01-01
    相关资源
    最近更新 更多