【问题标题】:Nil coalescing operator in swift returns a weird resultswift 中的 Nil 合并运算符返回一个奇怪的结果
【发布时间】:2016-08-25 19:05:05
【问题描述】:

如果我为变量 a 输入双问号而不是单问号,谁能告诉我为什么 Xcode 的 Playground 返回 nil? 由于溢出结果必须是 64,而不是 nil。

Swift 2.2 版, Xcode 7.3.1 版, OS X 版本 10.11.6

import Cocoa

   var b: Int8
   var c: String? = "128"
   var a: Int8?? = Int8(c!)

   b = 64

   func nilCoalescing() {
      a != nil ? a! : b
   }

   nilCoalescing()

【问题讨论】:

  • 你的函数没有返回任何东西。您也没有在任何地方使用 nil 合并运算符。
  • 但是如果我写 var a: Int8? = Int8(c!) 它返回 64。
  • 这不是您使用 nil 合并运算符的方式。你会想要var a: Int8(c!) ?? "Probably overflowed"这样的东西。
  • @JoshCaswell 它不需要返回任何东西。它是游乐场,而且 - 如果它会返回任何值,函数将以 -> ValueType 结尾
  • 操场有什么不同,@pedrouan?

标签: swift xcode swift-playground


【解决方案1】:

128 转换为 Int8 时溢出,因此存储为 nil。

【讨论】:

    【解决方案2】:

    这里发生了很多事情:

    1. a 溢出,因为128 大于可以存储在Int8 中的最大值(Int8.max = 127),因此它将返回nil

      这个nil,又名Optional.NoneOptional<Int8> 类型,不是aInt8??,又名Optional<Optional<Int8>>)的类型注释指定的类型,所以它被包装在另一个可选中,成为Optional.Some(Optional.None),现在是正确的类型。

    2. nilCoalescing() 不返回任何内容。 (这实际上意味着它返回(),又名Void

    3. 不要这样做明确的nil 检查并强制展开 (!):a != nil ? a! : b。改用??a ?? b

    你到底想在这里做什么?

    【讨论】:

    • "这个 nil,也就是 Optional.None 然后被包裹在另一个可选中,所以它变成了 Optional.Some(Optional.None)" 这可能是 OP 混乱的关键。
    • @JoshCaswell 这就是我的怀疑,但老实说我不知道​​。这都是非常荒谬的哈哈
    • 我偶尔尝试将 nil 分配给变量 a 两次。
    • @uncleFedex 好的,然后?
    • 无论你使用a != nil ? a! : b 还是a ?? b,这些表达式(几乎)是等价的。在这两种情况下,a 都是 not nil (正如你所说的那样,它是 Optional.Some(Optional.None))。因此表达式计算为a!,即Optional.None aka nil
    猜你喜欢
    • 2015-03-31
    • 2021-03-25
    • 1970-01-01
    • 2017-11-03
    • 2018-10-24
    • 2023-01-16
    • 1970-01-01
    • 2012-08-08
    • 2012-12-09
    相关资源
    最近更新 更多