处理swift 2

时间:2016-02-26 15:25:05

标签: error-handling swift2 nsdate

尽管这是一个特定的问题,但这个标题听起来很普遍。我只是不知道如何以更好的方式描述它...... 我已经阅读了很多关于swift错误处理的内容。但我仍然无法弄清楚如何解决这个简单(至少在Objective-C)任务。 我有一个文本字段,想要读出字符串值...而不是在NSDate值中格式化它。到目前为止没问题。但是如果你输入一个与指定日期格式不匹配的值,我会得到一个错误(女巫没问题......它的格式不正确)。在这种情况下,我只想保存标准值。在Objective-C中我会用@try @catch循环完成这个。 swift中不存在那种异常处理了吗? 这是我的代码。希望有人有答案。

func getDateFromTextfield() throws -> NSDate
{
    let formatter:NSDateFormatter = NSDateFormatter()
    formatter.dateFormat = "dd.MM.yyyy"
    formatter.timeZone = NSTimeZone(name: "UTC")

// Here should be a "throw expression" but I dont know how to set it. 

    let date:NSDate = formatter.dateFromString(dictOfLabelsAndText["Birthdate"] as! String)!

    return date
}

do
    {
    child.birthdateAT =  try self.getDateFromTextfield()
    }
    catch{
        child.birthdateAT = formatter.dateFromString("01.01.2000")
        print("wrong date") //Or whatever error
    }

3 个答案:

答案 0 :(得分:2)

Swift do - try - catch语法旨在处理类似于Objective-C中NSError模式的错误,而不是用于处理致命错误/异常。不要将Swift的错误处理do - try - catch的相似性与@try - {的完全不同的Objective-C异常处理模式相混淆{1}}。

当人们确切地知道他们不可能失败时,应该只使用强制解包(@catch)和强制类型转换(!)。如果它们可能失败(如本例所示),您应该优雅地检测这种情况并相应地处理它。

例如,您可以使用Swift错误处理来传达将字符串转换为日期的失败(然后在调用时使用as! - do - try模式为了检测和处理该错误):

catch

然后你可以这样做:

enum DateError: ErrorType {
    case BadDate
    case DateNotFound
}

func getDateFromTextfield() throws -> NSDate {
    let formatter:NSDateFormatter = NSDateFormatter()
    formatter.dateFormat = "dd.MM.yyyy"
    formatter.timeZone = NSTimeZone(name: "UTC")

    guard let dateString = dictOfLabelsAndText["Birthdate"] as? String else {
        throw DateError.DateNotFound
    }

    guard let date = formatter.dateFromString(dateString) else {
        throw DateError.BadDate
    }

    return date
}

或者,更简洁地说,使用do { child.birthdateAT = try getDateFromTextfield() } catch { child.birthdateAT = formatter.dateFromString("01.01.2000") } try?合并运算符:

nil

或者,您可以更改方法以返回可选项,并使用child.birthdateAT = try? getDateFromTextfield() ?? formatter.dateFromString("01.01.2000") 作为检测失败的方法:

nil

然后做:

func getDateFromTextfield() -> NSDate? {
    let formatter = NSDateFormatter()
    formatter.dateFormat = "dd.MM.yyyy"
    formatter.timeZone = NSTimeZone(name: "UTC")

    if let dateString = dictOfLabelsAndText["Birthdate"] as? String {
        return formatter.dateFromString(dateString)
    }

    return nil
}

或者,再次使用if let birthDate = getDateFromTextfield() { child.birthdateAT = birthDate } else { child.birthdateAT = formatter.dateFromString("01.01.2000") } 合并运算符:

nil

但是,除非你知道它不能是child.birthdateAT = getDateFromTextfield() ?? formatter.dateFromString("01.01.2000") ,否则不要使用!打开可选项。否则,使用可选的绑定和/或nil语句来优雅地检测并报告失败。

答案 1 :(得分:0)

选择您的错误 - 例如

enum DateError: ErrorType {
    case BadDate
    case Whatever
}

将其扔到你的评论

的地方
throw DateError.BadDate

答案 2 :(得分:0)

斯威夫特3
我试过这个。它有效,但不确定它是否是正确的方法

 enum DateError: Error, CustomStringConvertible {

    case badDate

    var description: String {
        switch self {

        case .badDate:
            return "Error: Invalid date detected."
        }
    }


}


func convertAMtoDateTime(amTime: String) throws -> String{


    let fromFormat: String = "hh:mm a"

    let toFormat: String = "yyyy-MM-dd hh:mm:ss"

    let formatter = DateFormatter()

    formatter.dateFormat = fromFormat

    let amDate = formatter.date(from: amTime)

    let dateTimeFormatter    = DateFormatter()

    dateTimeFormatter.dateFormat = toFormat

    var dateTime: String = ""

    if(amDate != nil){

         dateTime = dateTimeFormatter.string(from: amDate!)

    }
    else{

        throw DateError.badDate

    }

    return dateTime


}