错误处理对于每个应用程序的成功至关重要,它可以确保最终用户能够轻松浏览应用程序并正确使用功能。
在本教程中,我们将学习如何检测和解决一个简单的书店应用中的错误,该应用是由苹果和开源社区开发的通用编程语言Swift。
前提条件
要开始本教程,请确保你具备以下条件。
- 熟悉Swift编程
- 在您的本地机器上安装了Xcode
- 为Windows用户提供的在线Swift Playground
设置项目
为了开始建立我们的书店应用程序,让我们通过打开一个Xcode应用程序并在 "其他"选项卡中选择 "空"来创建一个空白的Xcode游乐场。
接下来,在新创建的目录中创建一个新的游戏场文件并命名。
文件中应该有默认的代码,将其修改为下面的代码,然后点击Play按钮,以确保代码的运行。
import UIKit
var str = "Hello, playground"
print(str)
运行这个应用程序,在控制台打印Hello, playground 。
完成这一切,我们就可以开始构建了。
用Swift构建一个应用程序
由于我们正在构建一个简单的书店应用程序,我们必须创建两个类:一个是购买书籍的用户,另一个是购买的物品。
User 类包含了用户的名字和可用余额,而Item 类包含了书的名字、书的价格,以及书在商店里的剩余数量。
class User {
var name: String
var walletBalance: Double
init(name: String, walletBalance: Double) {
self.name = name
self.walletBalance = walletBalance
}
}
class Item {
var bookName: String
var price: Double
var qtyLeft: Int
init(bookName: String, price: Double, qtyLeft: Int){
self.bookName = bookName
self.price = price
self.qtyLeft = qtyLeft
}
}
在我们的例子中,用户有一个特定的钱包余额来从商店购买一本书。为了确保在我们的应用程序中可以做到这一点,我们必须创建一个默认的用户和书。
let user1 = User(name: "Wisdom Ekpot", walletBalance: 2000)
let storeItem = Item(bookName: "Oliver Twist", price: 1000, qtyLeft: 12)
接下来,让我们创建一个函数,让用户从商店购买一本书。
func purchaseBookFromStore (user: User, book: Item){
user.walletBalance -= book.price
book.qtyLeft -= 1
print("\(user.name) successfully purchased \(book.bookName) from the store at \(book.price) naira")
print("Total number of books remaining = \(book.qtyLeft)")
print("New wallet balance = \(user.walletBalance)")
}
这个函数接收User 类和Item 类作为参数。然后,该函数从用户的钱包余额中扣除书价,并减少可购买的Oliver Twist 书的数量。
在减少这两个数量后,该函数打印出剩余书籍的数量和用户的钱包余额。要运行该程序,我们必须调用函数名,并将User 和Item 类作为参数传递。
purchaseBookFromStore(user: user1, book: Item)
点击 "播放"按钮来运行该程序。一旦程序完成了编译,控制台就会打印出以下内容。
Swift应用程序中的错误测试案例
在这个应用程序中可能会出现两个我们没有考虑到的主要问题。
- 如果用户的钱包余额买不起商店里的书怎么办?
- 如果商店里的书的数量少于用户想要购买的数量怎么办?
让我们用这些测试案例单独测试一下我们目前的代码。
价格错误
如果我们用let user1 = User(name: "Wisdom Ekpot", walletBalance: 500) ,将用户的钱包余额设置为500美元,然后试图用let storeItem = Item(bookName: "Oliver Twist", price: 1000, qtyLeft: 12) ,购买1000美元的Oliver Twist 书籍副本,控制台打印如下。
用户的新钱包余额现在是-500.0 ,这是一个错误。当用户的钱包余额少于书价时,我们必须打印一条错误信息,而不是从用户的钱包中扣除总书价。
数量错误
我们在购物应用程序中可能遇到的另一个测试案例是,当商店里的书比用户需要的书少时。
如果我们用let storeItem = Item(bookName: "Oliver Twist", price: 1000, qtyLeft: 0) ,将商店中Oliver Twist 书的数量设置为0,然后调用purchaseBookFromStore 函数来购买1 书,控制台会打印如下。
我们可以看到,现在商店里的书的总数是-1 。同样,在这里打印一个错误信息会让用户知道,商店里的书的数量少于所需的数量。
处理Swift应用程序中的错误
为了解决这些错误情况,让我们写一个条件来检查用户是否买得起这本书,以及该书的数量是否少于用户所需的数量。如果用户买不起这本书或者这本书的数量不够,我们就可以抛出一个错误。
在purchaseBookFromStore 功能块内,在执行任何操作之前添加这个条件。
if user.walletBalance < book.price || book.qtyLeft <= 0 {
throw NSError()
}
这时,如果满足条件,就会抛出一个错误,条件下面的代码就不会执行。
我们还必须确保这个函数具有抛出错误的能力。要做到这一点,我们必须用下面的方法修改我们的purchaseBookFromStore 函数。
func purchaseBookFromStore (user: User, book: Item) throws {
if user.walletBalance < book.price || book.qtyLeft <= 0 {
throw NSError()
}
user.walletBalance -= book.price
book.qtyLeft -= 1
print("\(user.name) successfully purchased \(book.bookName) from the store at \(book.price) naira")
print("Total number of books remaining = \(book.qtyLeft)")
print("New wallet balance = \(user.walletBalance)")
}
注意大括号前的throws 关键字;这修改了我们调用函数的方式,表明它可以抛出一个错误。
接下来,我们必须用一个do-catch块来包装我们的purchaseBookFromStore 函数。如果该函数返回一个错误,catch 块就会捕捉到这个错误并在控制台中打印出来。
do{
try purchaseBookFromStore(user: user1, book: storeItem)
}catch {
print("something went wrong")
}
如果我们再次运行我们的应用程序,我们会在控制台得到以下结果。记住要使用我们前面提到的任何一个错误测试案例来获得控制台中的错误信息。
抛出一个定义的错误
在我们应用程序的当前状态下,函数没有抛出适当的错误来告诉我们出了什么问题。要做到这一点,我们必须使用符合内置Swift错误类的Swift枚举来定义我们想要抛出的自定义错误。
Swift枚举特别适合于对一组相关的错误条件进行建模,因为它将相关的值分组,使我们能够在代码中以类型安全的方式处理这些值。
enum PurchaseError: Error {
case InsufficentWalletBalance
case InsufficentBookQty
}
有了这个枚举的定义,我们必须把我们的purchaseBookFromStore 函数中的条件分成两个独立的条件,比如下面这样。
if user.walletBalance < book.price{
}
if book.qtyLeft <= 0 {
}
现在,如果用户的钱包余额不足,我们的条件看起来像这样。
if user.walletBalance < book.price{
throw PurchaseError.InsufficentWalletBalance
}
如果商店里的书比用户想买的书少,我们的条件看起来像这样。
if book.qtyLeft <= 0 {
throw PurchaseError.InsufficentBookQty
}
最后,我们现在可以像这样捕捉个别错误。
do{
try purchaseBookFromStore(user: user1, book: storeItem)
}catch PurchaseError.InsufficentWalletBalance {
print("You don't have sufficent funds to carry out this transaction")
}catch PurchaseError.InsufficentBookQty{
print("Insufficent item quantity")
}catch{
print("Something went wrong")
}
最后一个catch块在抛出未定义的错误时作为默认的catch块。
总结
处理错误和显示自定义错误对于任何成功的应用程序都是至关重要的。通过定义错误并利用Swift中的do-catch功能,我们可以了解错误发生的原因并更快地解决问题。你可以在GitHub上获得这个项目的全部源代码。
The postError handling in Swiftappeared first onLogRocket Blog.