尽管这是一个特定的问题,但这个标题听起来很普遍。我只是不知道如何以更好的方式描述它...... 我已经阅读了很多关于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
}
答案 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
}