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

时间:2015-11-21 18:58:28

标签: swift

我在操场上玩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,所以我不明白这一点。

提前感谢您的帮助。

2 个答案:

答案 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-letguard-let(以及Optional.map)等工具几乎总是首选。

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

答案 1 :(得分:0)

如果我们查看first的说明,我们会看到它始终返回optional类型:

public var first: Self.Generator.Element? { get }