如何捕获可选 swift 字符串的所有边缘情况?
How to catch all edge cases for an optional swift string?
应用商店拒绝我的应用,我已将日志追溯到以下代码。我无法重现该问题,而且从我所看到的我的代码工作情况来看。但也许改进函数的编写方式可以解决我错过的边缘情况?
func getNSDate(stringDate: String) -> NSDate {
self.formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
guard (self.formatter.dateFromString(stringDate) != nil) else {
return NSDate()
}
return self.formatter.dateFromString(stringDate)!
}
/*
* 2016-09-05T19:00:00+0900 -> 午後7:00
*/
func getJapaneseTime(jDateString: String?) -> String {
let jDate = getNSDate(jDateString!)
let jTimeOfDay = ["AM":"午前", "PM":"午後"]
self.formatter.dateFormat = "a"
let timeOfDay = jTimeOfDay[self.formatter.stringFromDate(jDate)]
self.formatter.dateFormat = String(format: "%@h:mm", timeOfDay!)
return self.formatter.stringFromDate(jDate)
}
具体行:
self.formatter.dateFormat = String(format: "%@h:mm", timeOfDay!)
jDateString 示例:2016-10-23T19-30-00+09:00
我的崩溃日志指出:
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x000000010008af28
Termination Signal: Trace/BPT trap: 5
Termination Reason: Namespace SIGNAL, Code 0x5
Terminating Process: exc handler [0]
Triggered by Thread: 0
甲:
func getJapaneseTime(jDateString: String?) -> String {
let jDate = getNSDate(jDateString!)
函数中的 jDateString
被假定为非可选的,因为仅在使用它时它会被强制解包,为什么参数中的 optional
?
应该是
func getJapaneseTime(jDateString: String) -> String {
let jDate = getNSDate(jDateString)
在它外面使用 guard let
或 if let
展开。
乙:
let timeOfDay = jTimeOfDay[self.formatter.stringFromDate(jDate)]
self.formatter.dateFormat = String(format: "%@h:mm", timeOfDay!)
应该是if let timeOfDay =
或guard let timeOfDay =
,如果timeOfDay
为nil,则使用??
赋默认值。
总结
DO NOT USE !
OPERATOR EVERYWHERE. Prefer using if let
, guard let
and ??
to safely unwrap optionals.
编辑:此外,我认为您上面的所有代码都可以使用适当的 Locale 和 DateFormatter
的日期格式来实现。
应用商店拒绝我的应用,我已将日志追溯到以下代码。我无法重现该问题,而且从我所看到的我的代码工作情况来看。但也许改进函数的编写方式可以解决我错过的边缘情况?
func getNSDate(stringDate: String) -> NSDate {
self.formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
guard (self.formatter.dateFromString(stringDate) != nil) else {
return NSDate()
}
return self.formatter.dateFromString(stringDate)!
}
/*
* 2016-09-05T19:00:00+0900 -> 午後7:00
*/
func getJapaneseTime(jDateString: String?) -> String {
let jDate = getNSDate(jDateString!)
let jTimeOfDay = ["AM":"午前", "PM":"午後"]
self.formatter.dateFormat = "a"
let timeOfDay = jTimeOfDay[self.formatter.stringFromDate(jDate)]
self.formatter.dateFormat = String(format: "%@h:mm", timeOfDay!)
return self.formatter.stringFromDate(jDate)
}
具体行:
self.formatter.dateFormat = String(format: "%@h:mm", timeOfDay!)
jDateString 示例:2016-10-23T19-30-00+09:00
我的崩溃日志指出:
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x000000010008af28
Termination Signal: Trace/BPT trap: 5
Termination Reason: Namespace SIGNAL, Code 0x5
Terminating Process: exc handler [0]
Triggered by Thread: 0
甲:
func getJapaneseTime(jDateString: String?) -> String {
let jDate = getNSDate(jDateString!)
函数中的 jDateString
被假定为非可选的,因为仅在使用它时它会被强制解包,为什么参数中的 optional
?
应该是
func getJapaneseTime(jDateString: String) -> String {
let jDate = getNSDate(jDateString)
在它外面使用 guard let
或 if let
展开。
乙:
let timeOfDay = jTimeOfDay[self.formatter.stringFromDate(jDate)]
self.formatter.dateFormat = String(format: "%@h:mm", timeOfDay!)
应该是if let timeOfDay =
或guard let timeOfDay =
,如果timeOfDay
为nil,则使用??
赋默认值。
总结
DO NOT USE
!
OPERATOR EVERYWHERE. Prefer usingif let
,guard let
and??
to safely unwrap optionals.
编辑:此外,我认为您上面的所有代码都可以使用适当的 Locale 和 DateFormatter
的日期格式来实现。