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

标签 swift

我正在 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/

相关文章:

ios - UICollectionView reloadData 只工作两次

swift - 定义中的引用结构 - Swift

swift - 在媒体繁重的 swift 应用程序中管理内存的正确方法是什么?释放它?

ios - 将 Pod 添加到 Xcode 项目会阻碍构建

ios - 当我在 iOS 中切换语言 RTL 时,UIPickerView 文本未居中对齐

swift - 将@State 值委托(delegate)给子组件

swift - keyDown 事件不适用于 shift 键且仅适用于 shift 键

ios - 如何在Swift中放慢MapView动画的速度?

swift - 如何从 iCloud 下载图像而不重新保存?

ios - 如何将数据从变量传递到数组?