斯威夫特:尝试,尝试?,尝试! 和“双重可选”。
Swift引入了比目标C更好,更简单的错误处理方法。您可以使用swift关键字throws
标记一个方法,这意味着该方法可能会引发错误,调用者必须根据需要进行处理。
枚举UserNameError:错误{
案例userIdNotExist
} func getNameOfUser(userId uid:Int)引发->字符串{如果uid == 0 {
返回“亚历克斯”
}否则,如果uid == 1 {
返回“杰克”
} if uid == 2 {
返回“吉尔”
抛出UserNameError.userIdNotExist
}
在此示例中,方法getNameOfUser
仅处理3个getNameOfUser
。 对于其他userId,它将引发错误。 现在让我们看看如何使用Try
, Try!
和Try?
用于调用此方法。
尝试
您可以通过两种方式使用它。 第一个是使用try / catch调用时捕获错误。
func callerMethod(){做{让名字=尝试getNameOfUser(userId:1)}捕获{
//处理错误
}
}
..或确保,调用方方法标记为throws
,将错误传递给调用链。
func callerMethod()抛出{让名字=尝试getNameOfUser(userId:1)}
尝试?
这是最新的功能。 它返回一个可选值,并在调用成功后成功展开。 如果出现任何错误,它将返回nil 。
func callerMethod(){让名称=尝试? getNameOfUser(userId:1)}
在给定的示例中,变量name
将为用户ID 0、1和2获得解包的字符串值。但是对于其他用户ID, name
将为nil。 可以使用guard
关键字处理相同的问题
func callerMethod(){保护让名字=尝试? getNameOfUser(userId:1)else {//通过抛出错误或执行返回操作来处理错误
} //名称现在可以使用,因为它拥有未包装的值
}
尝试!
与Try?
相同Try?
但是会强制展开。 因此,如果发生错误,可能会导致崩溃。 如果您确定被调用方方法将要返回值,请使用此方法。
func callerMethod(){让名称=尝试! getNameOfUser(userId:1)}
在此示例中,userIds 0、1和2将返回有效的String,但其他任何情况都会导致崩溃。
双重可选
希望您能达到上述目标。.现在有一个特殊的情况,这些都不起作用。 那就是Double Optionals
。 让我们对此有一个特殊的情况。 我们将为此修改简单的getNameOfUser
方法。
func getNameOfUser(userId uid:Int)抛出->字符串? {如果uid == 0 {
返回“亚历克斯”
}否则,如果uid == 1 {
返回“杰克”
} if uid == 2 {
返回零
抛出UserNameError.userIdNotExist
}
在此修改的示例中, getNameOfUser
方法现在返回可选值。 在这种情况下,userId 2返回nil,但对于0、1和2以外的值,此方法也可能引发错误。
当您使用Try!
,它仍会返回一个可选值,而不是未包装的值。 如果使用Try?
,它提供了一个可选选项,但您将能够看到2 ??
在调试器中。 检查调试器窗口的以下屏幕截图
第二个屏幕截图显示为Double Optional
。 要解决此问题,您必须将其拆开两次。
…或用case let
关键字。