我有以下抛出函数:
func doSomething(_ myArray: [Int]) throws -> Int {
if myArray.count == 0 {
throw arrayErrors.empty
}
return myArray[0]
}
但是当数组等于0时,它将抛出错误,但它将继续执行返回空数组的函数。
当转到if语句时如何退出该函数?
答案 0 :(得分:2)
抛出错误时,函数会返回。在操场上弹出这个并查看输出。
//: Playground - noun: a place where people can play
enum MyError: Error {
case emptyArray
}
func doSomething<T>(_ array: [T]) throws -> T {
guard !array.isEmpty else {
throw MyError.emptyArray
}
return array[0]
}
do {
let emptyArray: [Int] = []
let x = try doSomething(emptyArray)
print("x from emptyArray is \(x)")
} catch {
print("error calling doSeomthing on emptyArray: \(error)")
}
do {
let populatedArray = [1]
let x = try doSomething(populatedArray)
print("x from populatedArray is \(x)")
} catch {
print("error calling doSeomthing on emptyArray: \(error)")
}
您将看到输出
error calling doSeomthing on emptyArray: emptyArray
x from populatedArray is 1
请注意,您没有看到print("x from emptyArray is \(x)")
的输出,因为它从未被调用,因为throw
结束了该函数的执行。您也可以确认这一点,因为guard
语句需要退出函数。
另外,请注意,如果你想要一个数组中的第一个东西,你可以使用myArray.first
返回T?
,你可以处理nil情况而不必处理错误。例如:
//: Playground - noun: a place where people can play
let myArray = [1, 2, 3]
if let firstItem = myArray.first {
print("the first item in myArray is \(firstItem)")
} else {
print("myArray is empty")
}
let myEmptyArray: [Int] = []
if let firstItem = myEmptyArray.first {
print("the first item in myEmptyArray is \(firstItem)")
} else {
print("myEmptyArray is empty")
}
输出:
the first item in myArray is 1
myEmptyArray is empty
答案 1 :(得分:1)
您需要了解错误处理。如果您插入throws
关键字,则任何调用它的人都需要使用do-catch
语句,try?
,try!
或继续传播它们。因此,如果抛出错误将会发生什么事情取决于调用者。
以下是一个例子:
do {
try doSomething(foo)
} catch arrayErrors.empty {
fatalError("Array is empty!")
}
Apple的error handling
文档如果您想在到达if
后退出,只需不要使用错误处理并在if中调用fatalError
。
if myArray.count = 0 {
fatalError("Error happened")
}