首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组字符串打印可选,为什么?

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

Stack Overflow用户
提问于 2015-11-21 18:58:28
回答 2查看 74关注 0票数 2

我在操场上玩数组,我有点困惑。这是代码:

代码语言:javascript
复制
var players = ["tob", "cindy", "mindy"] //["tob", "cindy", "mindy"]
print(players.isEmpty) // False
var currentPlayer = players.first // "tob"
print(currentPlayer) // "Optional("tob")\n"

为什么上面写着“可选”?我找到了解释:“属性首先实际上返回一个可选的,因为如果数组是空的,那么首先将返回零。”

但它不是空的。.isEmpty //false,所以我不理解这一点。

谢谢你提前帮忙。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-21 19:09:04

正确的看待Optional的方法是,这可能有价值,也可能没有价值。空列表的第一个元素是什么?没有这回事。这不是一种价值。我们称之为缺少值nil.None

在Swift中,变量必须具有特定类型。所以你的例子是:

代码语言:javascript
复制
let currentPlayer = players.first

currentPlayer的类型是什么?它可能是一个String,也可能什么都不是。这是一个“可能的字符串”,在Swift中被称为Optional<String>players是否有元素并不会改变currentPlayer的类型。

如果您想要做一些事情,如果-和-仅-如果变量有一个值,那么有许多方法。最简单的是if-let

代码语言:javascript
复制
let players = ["tob", "cindy", "mindy"] //["tob", "cindy", "mindy"]
print(players.isEmpty) // False
if let currentPlayer = players.first {
    print(currentPlayer)
}

这将打印tob,正如您所期望的。

另一个非常常见的方法是guard let

代码语言:javascript
复制
let players = ["tob", "cindy", "mindy"] //["tob", "cindy", "mindy"]
guard let currentPlayer = players.first else { return }
print(currentPlayer)

这使您可以避免将函数的其余部分嵌套在大括号内,但在其他方面则是相同的方法。

可以使用!将可选选项转换为其底层类型,但这是非常危险的,除非绝对必要,否则应该避免。像if-letguard-let (以及Optional.map)这样的工具几乎总是首选的。

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

票数 5
EN

Stack Overflow用户

发布于 2015-11-21 19:02:25

如果我们查看first的描述,我们会发现它总是返回optional类型:

代码语言:javascript
复制
public var first: Self.Generator.Element? { get }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33847330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档