斯威夫特:尝试,尝试?,尝试! 和“双重可选”。

Swift引入了比目标C更好,更简单的错误处理方法。您可以使用swift关键字throws标记一个方法,这意味着该方法可能会引发错误,调用者必须根据需要进行处理。

 枚举UserNameError:错误{ 
案例userIdNotExist
} func getNameOfUser(userId uid:Int)引发->字符串{如果uid == 0 {
返回“亚历克斯”
}否则,如果uid == 1 {
返回“杰克”
} if uid == 2 {
返回“吉尔”
抛出UserNameError.userIdNotExist
}

在此示例中,方法getNameOfUser仅处理3个getNameOfUser 。 对于其他userId,它将引发错误。 现在让我们看看如何使用TryTry!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关键字。

Interesting Posts