我在操场上玩阵列,我有点困惑.这是代码:
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,所以我不明白这一点.
提前感谢您的帮助.
正确的思考方式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-let和guard-let(和Optional.map)的工具几乎总是首选.
但这里的关键是要理解所有Swift变量都有一个类型,有时候这种类型是"也许它有一个值,也许它没有."