我正在 Playground 上玩数组,我有点困惑。这是代码:
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,所以我不明白这一点。
感谢您提前提供帮助。
最佳答案
正确的思考方式Optional
是这可能有也可能没有值(value)。空列表的第一个元素是什么?哪有这回事。它不是一个值。我们称之为缺乏值(value) 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 变量都有单一类型,有时该类型是“也许它有值,也许没有。”
关于swift - 字符串打印数组 可选,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33847330/