我在操场上玩数组,我有点困惑。这是代码:
var players = ["tob", "cindy", "mindy"] //["tob", "cindy", "mindy"]
print(players.isEmpty) // False
var currentPlayer = players.first // "tob"
print(currentPlayer) // "Optional("tob")\n"为什么上面写着“可选”?我找到了解释:“属性首先实际上返回一个可选的,因为如果数组是空的,那么首先将返回零。”
但它不是空的。.isEmpty //false,所以我不理解这一点。
谢谢你提前帮忙。
发布于 2015-11-21 19:09:04
正确的看待Optional的方法是,这可能有价值,也可能没有价值。空列表的第一个元素是什么?没有这回事。这不是一种价值。我们称之为缺少值nil或.None。
在Swift中,变量必须具有特定类型。所以你的例子是:
let currentPlayer = players.firstcurrentPlayer的类型是什么?它可能是一个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)这使您可以避免将函数的其余部分嵌套在大括号内,但在其他方面则是相同的方法。
可以使用!将可选选项转换为其底层类型,但这是非常危险的,除非绝对必要,否则应该避免。像if-let和guard-let (以及Optional.map)这样的工具几乎总是首选的。
但是这里的关键是要理解所有Swift变量都有一个类型,有时这种类型是“可能它有一个值,也许它没有。”
发布于 2015-11-21 19:02:25
如果我们查看first的描述,我们会发现它总是返回optional类型:
public var first: Self.Generator.Element? { get }https://stackoverflow.com/questions/33847330
复制相似问题