请帮我修改这段代码,
if let dateVaule = UserDefaults().value(forKey: SplashSeenDate){
let dateStr = dateVaule as! String
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.timeZone = TimeZone.ReferenceType.local
let date = dateFormatter.date(from:dateStr)
if Global.sharedInstance.Splashs != nil && Global.sharedInstance.Splashs?.count != 0{
for (i,splash) in (Global.sharedInstance.Splashs?.enumerated().reversed())!{
if !checkTimeStamp(date: splash.create_timestamp,StoredDate: date!){
Global.sharedInstance.Splashs?.remove(at: i)
}
}
print(Global.sharedInstance.Splashs?.count ?? "-1")
}
}
老实说,我对日期格式化程序非常困惑。 当这个项目启动时,它在
发生了崩溃if !checkTimeStamp(date: splash.create_timestamp,StoredDate: date!){
然而,我无法复制此崩溃... **只有少数iOS10用户发生了这次崩溃。**请提出建议,非常感谢!
func checkTimeStamp(date: String!,StoredDate: Date) -> Bool {
let dateFormatter: DateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.locale = Locale(identifier:"en_US_POSIX")
let datecomponents = dateFormatter.date(from: date)
if (datecomponents! >= StoredDate) {
return true
} else {
return false
}
}
答案 0 :(得分:5)
您正在以两种不同的方式将String
转换为Date
:
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.timeZone = TimeZone.ReferenceType.local //###Why don't you use `TimeZone.current`?
let date = dateFormatter.date(from:dateStr)
在checkTimeStamp(date: String!,StoredDate: Date) -> Bool
:
let dateFormatter: DateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.locale = Locale(identifier:"en_US_POSIX")
let datecomponents = dateFormatter.date(from: date)
在您的情况下,第一次转换缺少此行:
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
您可以找到许多文章,讨论返回DateFormatter
的{{1}}(或旧文章中的NSDateFormatter
)。
当您使用nil
等固定格式的DateFormatter
时,必须将"yyyy-MM-dd HH:mm:ss"
设置为locale
。
也许您最好定义一种转换方法(或计算属性),以便将Locale(identifier: "en_US_POSIX")
转换为适合您应用的要求的String
,并在您需要的任何地方使用{ {1}}转换为Date
:
String
通常,您的代码使用过多的强制解包或强制转换。您可以在不使用任何强制性内容的情况下重新编写它:
Date
(假设extension String {
var toAppDate: Date? {
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
dateFormatter.timeZone = TimeZone.current
dateFormatter.locale = Locale(identifier: "en_US_POSIX") //### <- Do not miss.
return dateFormatter.date(from: self)
}
}
不是可选的,并将参数标签 if
let dateStr = UserDefaults().string(forKey: SplashSeenDate),
let date = dateStr.toAppDate,
let splashes = Global.sharedInstance.Splashs, !splashes.isEmpty
{
//### In most cases, `filter` is faster than repeated `remove`.
Global.sharedInstance.Splashs = splashes.filter {
checkTimeStamp(date: $0.create_timestamp, storedDate: date)
}
print(Global.sharedInstance.Splashs?.count ?? "-1")
}
重命名为create_timestamp
。)
答案 1 :(得分:0)
似乎splash.create_timestamp
正在变为nil,当您传递此函数checkTimeStamp
时。它正在崩溃。您可以通过将checkTimeStamp函数中的date参数更改为可选来防止崩溃,并在传递函数之前使用guard语句。