使用高级描述在 Swift 中定义自定义错误
Swift 提供了一种强大的机制来定义我们自己的自定义错误,从而可以更好地处理错误,并在我们的应用程序中创建更具信息性和用户友好的错误。当我们旨在增强基于 Swift 的项目的健壮性和可用性时,此功能至关重要。通过编写适当的自定义错误,我们可以清晰准确地指导用户,从而显著改善整体用户体验。
在这篇文章中,我们将深入探讨在 Swift 中定义自定义错误的基本知识,探索特定方面并了解一些鲜为人知但非常有价值的 API。通过实际示例和详细解释,你将获得知识,让你编写出更可靠、对用户更直观的软件。
创建自定义错误类型
定义自定义错误需要实现自定义类型,更具体地说,是枚举。这必须强制符合 Error 协议,原因很重要;如果没有该一致性,枚举中定义的案例将无法在 do-catch 语句中捕获,而这是在指定自定义错误时的最终目标。
让我们看一个假设场景的示例,其中我们实现了一个包含有关用户提供的密码的错误的自定义类型:
enum PasswordError: Error {
case tooShort(minLength: Int)
case tooLong(maxLength: Int)
case noUppercaseCharacter
case noLowercaseCharacter
case noNumber
case noSpecialCharacter
case easilyGuessed
}
上面演示的 PasswordError 枚举包含有和没有关联值的案例的混合。每个案例都表示用户尝试在表单中输入密码时可能发生的不同类型的错误。具有关联值的枚举包含有关错误的其他信息。
上面的示例足以定义自定义错误。但是,它仅在不希望也向用户提供任何类型的错误描述时才足够。这是一个完全可以接受的情况,因为我们可能会定义供内部使用的错误,而文本描述永远不会传递给用户或我们开发者。另一方面,如果需要错误描述,那么我们可以从几个选项中进行选择来指定它们。
指定基本错误描述
定义自定义错误描述的最常见和最常见的方法是通过符合 CustomStringConvertible 协议并实现必需的 description 计算属性。通常,并且主要是出于清晰度的原因,该一致性发生在包含自定义错误案例的枚举的扩展中。
对于我们的 PasswordError 示例,我们可以实现以下内容:
extension PasswordError: CustomStringConvertible {
var description: String {
switch self {
case .tooShort:
return “密码太短”
case .tooLong:
return “密码太长”
case .noUppercaseCharacter:
return “密码缺少大写字母”
case .noLowercaseCharacter:
return “密码缺少小写字母”
case .noNumber:
return “密码缺少数字”
case .noSpecialCharacter:
return “密码缺少特殊字符”
case .easilyGuessed:
return “密码很常见”
}
}
}
大多数情况下,类似于此处演示的实现是好的,因此我们可以获得错误的文本描述。我们可以在调试时在控制台中打印它们,并对我们在应用程序制作过程中遇到的各种问题得出结论。
let error = PasswordError.noUppercaseCharacter
print(error.description)
// 输出:密码缺少大写字母
但是,当涉及面向用户的描述时,这不是最佳选择。有一个更好的选择,正如你接下来将看到的,它带来了一些优势。
