Skip to main content

function

好問題!讓我解釋為什麼需要加上 try!

原因說明

  1. square 函數會拋出錯誤

    static func square(_ num: Int) throws -> UInt64

    注意函數簽名中的 throws 關鍵字,這表示這個函數可能會拋出錯誤。

  2. Swift 的錯誤處理機制: 在 Swift 中,當你呼叫一個可能拋出錯誤的函數(標記為 throws)時,你必須明確處理這個錯誤。有幾種方式:

    • try - 需要處理錯誤
    • try? - 如果出錯返回 nil
    • try! - 強制執行,如果出錯會崩潰
  3. 為什麼使用 try!: 在 total 函數中,我們知道迴圈 for i in 1...64 中的每個 i 值都是有效的(1 到 64),因為:

    • 我們的 square 函數只會在 num < 1num > 64 時拋出錯誤
    • 迴圈中的 i 值範圍是 1 到 64,完全在有效範圍內
    • 因此 square(i) 永遠不會拋出錯誤
  4. try! 的含義

    • try! 告訴編譯器:「我確定這個函數不會拋出錯誤,如果它真的拋出了錯誤,就讓程式崩潰」
    • 這是一種「強制解包」的概念,類似於 ! 用於可選值

其他選擇

如果你不想使用 try!,也可以這樣寫:

static var total: UInt64 {
var result: UInt64 = 0
for i in 1...64 {
do {
result += try square(i)
} catch {
// 這裡永遠不會執行,因為 i 在 1...64 範圍內
fatalError("Unexpected error: \(error)")
}
}
return result
}

但使用 try! 更簡潔,因為我們確定不會有錯誤。