字符串打印数组可选,为什么?

Dar*_*Man 2 swift

我在操场上玩阵列,我有点困惑.这是代码:

var players = ["tob", "cindy", "mindy"] //["tob", "cindy", "mindy"]
print(players.isEmpty) // False
var currentPlayer = players.first // "tob"
print(currentPlayer) // "Optional("tob")\n"
Run Code Online (Sandbox Code Playgroud)

为什么说"可选"?我找到了解释:"该属性首先实际返回一个可选项,因为如果数组为空,则首先返回nil."

但它不是空的..isEmpty // false,所以我不明白这一点.

提前感谢您的帮助.

Rob*_*ier 5

正确的思考方式Optional是,这可能有也可能没有价值.空列表的第一个元素是什么?哪有这回事.这不是一个价值.我们称缺乏价值nil.None.

在Swift中,变量必须具有特定类型.你的榜样如此:

let currentPlayer = players.first
Run Code Online (Sandbox Code Playgroud)

是什么类型的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)
}
Run Code Online (Sandbox Code Playgroud)

这将tob按照您的预期打印.

另一个非常常见的方法是 guard let

let players = ["tob", "cindy", "mindy"] //["tob", "cindy", "mindy"]
guard let currentPlayer = players.first else { return }
print(currentPlayer)
Run Code Online (Sandbox Code Playgroud)

这样可以避免在花括号内嵌入函数的其余部分,但其他方法也是如此.

使用可以将Optional转换为其底层类型!,但这是非常危险的,除非绝对必要,否则应该避免.类似if-letguard-let(和Optional.map)的工具几乎总是首选.

但这里的关键是要理解所有Swift变量都有一个类型,有时候这种类型是"也许它有一个值,也许它没有."