思考Optional 的正确方法是它可能有值,也可能没有值。空列表的第一个元素是什么?哪有这回事。它不是一个值。我们称其为缺少值nil 或.None。
在 Swift 中,变量必须具有特定的类型。所以你的例子:
let currentPlayer = players.first
currentPlayer 的类型是什么?它可能是String,也可能什么都不是。它是一个“可能的字符串”,在 Swift 中称为Optional<String>。 players 是否有元素不会改变currentPlayer 的类型。
如果你想在变量有值的情况下做某事,那么有很多方法。最简单的是if-let。
let players = ["tob", "cindy", "mindy"] //["tob", "cindy", "mindy"]
print(players.isEmpty) // False
if let currentPlayer = players.first {
print(currentPlayer)
}
这将按照您的预期打印tob。
另一种非常常见的方法是guard let
let players = ["tob", "cindy", "mindy"] //["tob", "cindy", "mindy"]
guard let currentPlayer = players.first else { return }
print(currentPlayer)
这可以让您避免将函数的其余部分嵌套在花括号内,但其他方法相同。
可以使用! 将 Optional 转换为其底层类型,但这是非常危险的,除非绝对必要,否则应避免。 if-let 和 guard-let(以及 Optional.map)之类的工具几乎总是首选。
但这里的关键是要理解所有 Swift 变量都有一个类型,有时那个类型是“也许它有一个值,也许它没有。”