我在操场上玩Arrays,我有点困惑。这是代码:
var players = ["tob", "cindy", "mindy"] //["tob", "cindy", "mindy"]
print(players.isEmpty) // False
var currentPlayer = players.first // "tob"
print(currentPlayer) // "Optional("tob")\n"
为什么说“可选”? 我找到了解释:“属性 first 实际上返回一个可选项,因为如果数组为空, first 将返回nil。”
但它不是空的。 .isEmpty // false,所以我不明白这一点。
提前感谢您的帮助。
答案 0 :(得分:5)
考虑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变量都有一个类型,有时候这个类型是“也许它有一个值,也许它没有。”
答案 1 :(得分:0)
如果我们查看first
的说明,我们会看到它始终返回optional
类型:
public var first: Self.Generator.Element? { get }