2017-02-24 61 views
-1

我已經用下面的函數拋出不退出功能:功能的投用執行特羅

func doSomething(_ myArray: [Int]) throws -> Int { 

    if myArray.count == 0 { 
     throw arrayErrors.empty 
    } 
    return myArray[0] 
} 

但是,當陣列等於0,它會拋出錯誤,但它會繼續執行功能返回空數組。

如何在轉到if語句時退出函數?

+3

你所說的 「返回空數組」 是什麼意思?你的函數返回一個'Int'。 – Hamish

+2

你在你的問題中所作的陳述不是真實的,其中大部分都沒有意義。當你說*「當數組等於0」*時,你的意思是「當數組爲空時」嗎?不,如果實際調用「throw」行,它將不會繼續到'return'行,並且不會返回任何內容。 – rmaddy

回答

1

您需要了解錯誤處理。如果您插入throws關鍵字,任何調用它的人都需要使用do-catch語句,try?,try!或繼續傳播它們。那麼如果錯誤發生將會發生什麼取決於調用者。

下面是一個例子:

do { 
    try doSomething(foo) 
} catch arrayErrors.empty { 
    fatalError("Array is empty!") 
} 

蘋果的error handling

如果你想退出,一旦你到達if,根本就沒有使用錯誤處理和呼叫fatalError的,如果裏面的文件。

if myArray.count = 0 { 
    fatalError("Error happened") 
} 
1

該函數在您拋出錯誤時會返回。在操場上彈出並觀察輸出。

//: 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?,你可以處理這個零案例,而不必處理一個錯誤。例如:

//: 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