0

如何do-try-catch在下面的这个函数中添加控件?

self.convertDateFromString("23282019111259318")

func convertDateFromString(stringDateTimeParameter : String)
{
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "MMddyyyyHHmmssSSS"

    guard let myDate = dateFormatter.date(from: stringDateTimeParameter) else {
    fatalError("ERROR: Date conversion failed due to mismatched format.")}

    print("myDate: \(myDate)")
}

如您在上面的示例中看到的。我每月发送 23 个值以获取错误。然后应用程序被设备停止。我需要处理这种情况。应用程序不应停止,我应该在 catch 范围内看到 print(error)。

如何do-try-catch在此功能中添加控件?我写了它,但我没有在 catch 范围内看到打印行。这就是我问的原因。

4

2 回答 2

3

您不能让日期格式化程序抛出错误,但如果需要,您可以从此方法抛出错误,例如

enum DateConversionError: Error {
    case unableToParseString
}

func dateFromString(stringDateTimeParameter: String) throws -> Date {
    let formatter = DateFormatter()
    formatter.dateFormat = "MMddyyyyHHmmssSSS"
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.timeZone = TimeZone(secondsFromGMT: 0)     // or omit to use your current time zone

    guard let date = formatter.date(from: stringDateTimeParameter) else {
        throw DateConversionError.unableToParseString
    }

    return date
}

然后您可以执行以下操作:

do {
    let date = try dateFromString(stringDateTimeParameter: "23282019111259318")
    print(date)
} catch {
    print(error)
}

话虽如此,感觉就像我们在扭曲自己以抛出错误。使用选项更简单:

func dateFromString(stringDateTimeParameter: String) -> Date? {
    let formatter = DateFormatter()
    formatter.dateFormat = "MMddyyyyHHmmssSSS"
    formatter.locale = Locale(identifier: "en_US_POSIX")
    formatter.timeZone = TimeZone(secondsFromGMT: 0)     // or omit to use your current time zone

    return formatter.date(from: stringDateTimeParameter)
}

guard let date = dateFromString(stringDateTimeParameter: "23282019111259318") else {
    print("unable to parse date")
    return
}

// use `date` here

如果您正在解析 Web API 响应,那么该响应是 JSON 格式的,我倾向于使用JSONDecoder并指定以下格式器dateDecodingStrategy

let decoder = JSONDecoder()

let formatter = DateFormatter()
formatter.dateFormat = "MMddyyyyHHmmssSSS"
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = TimeZone(secondsFromGMT: 0)

decoder.dateDecodingStrategy = .formatted(formatter)

// use `decoder` to parse your JSON and it will handle conversions/errors for you

这引出了一个问题,为什么您使用这种MMddyyyyHHmmssSSS格式,而不是标准格式,例如yyyy-MM-dd'T'HH:mm:ss.SSSX,但这是一个单独的问题。


最后,创建日期格式化程序是一个昂贵的过程。您真的不希望将其隐藏在您的dateFromString方法中,您可能会多次调用该方法。实例化一次格式化程序,然后让您的dateFromString方法使用已经创建的格式化程序。

于 2019-03-20T20:59:36.757 回答
1

如果你想用来do-catch处理错误,你需要为你的函数创建一个错误类型来抛出:

struct DateConvertError : Error
{
    let description: String
}

格式化程序不会告诉您为什么它无法解析,所以这没有多大意义,但是您的函数可以标记为throws

func convertDateFromString(stringDateTimeParameter : String) throws -> Date
{
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "MMddyyyyHHmmssSSS"

    guard let date = dateFormatter.date(from: stringDateTimeParameter) else {
        throw DateConvertError(description: "Could not parse")
    }

    return date
}

然后当你称它为doa时try

let date: Date
do {
    date = try convertDateFromString(stringDateTimeParameter: "23282019111259318")
} catch {
    // Handle failure
}
于 2019-03-20T21:02:05.887 回答