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

时间:2016-08-25 19:05:06

标签: swift xcode swift-playground

如果我为变量a添加双问号而不是单个问号,有人能告诉我为什么Xcode的Playground会返回nil吗? 由于溢出结果必须是64,而不是零。

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()

2 个答案:

答案 0 :(得分:3)

转换为Int8时,

128溢出,因此存储为nil。

答案 1 :(得分:2)

这里有很多事情发生了:

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

    nil,即Optional.None类型Optional<Int8>不是类型注释a指定的类型(Int8??,又名{{1} }}),所以它包装在另一个可选项中,成为Optional<Optional<Int8>>,现在是正确的类型。

  2. Optional.Some(Optional.None)不会返回任何内容。 (这实际上意味着它返回nilCoalescing(),a.k.a。()

  3. 请勿明确Void检查并强行展开(nil):!。请改为使用a != nil ? a! : b??

  4. 你到底想做什么?