swift returns 中的 Nil 合并运算符一个奇怪的结果

Nil coalescing operator in swift returns a weird result

谁能告诉我为什么 Xcode's Playground returns nil 如果我用双问号代替变量 a 的单问号? 由于溢出结果必须是 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()

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

这里发生了很多事情:

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

    这个nil,a.k.a。 Optional.None是类型Optional<Int8>不是a的类型注解指定的类型(Int8??,a.k.a。Optional<Optional<Int8>>),所以是包装在另一个可选中,成为 Optional.Some(Optional.None),现在是正确的类型。

  2. nilCoalescing() 没有 return 任何东西。 (其实就是returns (), a.k.a. Void

  3. 不要执行此显式 nil 检查并强制解包 (!):a != nil ? a! : b。使用 ?? 代替:a ?? b

你到底想在这里做什么?