【问题标题】:Array of String printing Optional, why?字符串打印的数组 可选的,为什么?
【发布时间】:2015-11-21 18:58:28
【问题描述】:

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

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,所以我没看懂。

提前感谢您的帮助。

【问题讨论】:

    标签: swift


    【解决方案1】:

    思考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 变量都有一个类型,有时那个类型是“也许它有一个值,也许它没有。”

    【讨论】:

    • 非常感谢,感谢您写的内容。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-21
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多