如何捕获可选 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 letif 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.

编辑:此外,我认为您上面的所有代码都可以使用适当的 LocaleDateFormatter 的日期格式来实现。