Menu
CoddyTech

try? 和 try!

本课属于 Coddy Swift 学习旅程的“逻辑与流程”单元。第 46 课,共 56 课。

有时你不在意函数抛出了哪种错误,只想要一个结果或备用值。Swift 提供了两种简写形式。

try? 会将所有抛出的错误转换为 nil。结果是一个类型与函数返回类型相同的 Optional:

enum E: Error { case nope }
func risky() throws -> Int { throw E.nope }

let result = try? risky()        // nil
let safe   = (try? risky()) ?? 0 // 0

将它与 ?? 搭配使用,可以提供内联默认值。这是“调用这个东西,无论如何都给我一个值”最简短的写法。

try!表示“我知道这不会抛出异常”。如果真的抛出了异常,程序就会崩溃。只有在你能证明调用是安全的时候才使用它;在日常代码中,优先使用带备用方案的try?,或完整的do/catch。

challenge icon

挑战

简单

定义包含一个 case bad 的 NumError: Error。定义一个会抛出异常的 parseEven(_ s: String) throws -> Int,它需要:

  • 当 s 无法解析为 Int,或者解析出的值是奇数时,抛出 .bad
  • 否则,返回解析出的整数

读取一行输入:由逗号分隔的字符串列表。对每个字符串,使用 try?,然后使用 ?? -1,以获取解析出的偶数,或者获取 -1。

按顺序打印得到的整数,并用 , 连接。然后在第二行打印结果为 -1 的值的数量。

对于输入 4,7,abc,8,11,2,输出为:

4,-1,-1,8,-1,2
3

亲手试试

let parts = readLine()!.components(separatedBy: ",")

// TODO: enum NumError; func parseEven(_:) throws -> Int;
// 对每个 part,使用 (try? parseEven(part)) ?? -1
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Swift 在线编辑器