swift中的Nil合并操作符返回一个奇怪的结果



谁能告诉我为什么Xcode的操场返回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),因此它将返回nil

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

  2. nilCoalescing()没有返回任何东西。(这实际上意味着它返回(),也就是Void)

  3. 不要做这个显式的nil检查和强制展开(!): a != nil ? a! : b。用??代替:a ?? b

你到底想干什么?

最新更新