为什么Swift nil-coalescing返回一个Optional?

J. *_*coe 7 type-inference swift

首先,我尝试映射a [String?],得到一个[String]:

$ xcrun swift
Welcome to Apple Swift version 2.2 (swiftlang-703.0.18.8 clang-703.0.30). Type :help for assistance.
  1> import Foundation
  2> let j: [String?] = ["a", nil]
j: [String?] = 2 values {
  [0] = "a"
  [1] = nil
}
  3> j.map {$0 ?? ""}
$R0: [String] = 2 values {
  [0] = "a"
  [1] = ""
}
Run Code Online (Sandbox Code Playgroud)

这对我来说非常有意义.我没有合并String?,我得到了一个String.但是[AnyObject?],有一些奇怪的事情发生:

  4> let k: [AnyObject?] = ["a", nil]
k: [AnyObject?] = 2 values {
  [0] = "a"
  [1] = nil
}
  5> k.map {$0 ?? ""}
$R1: [AnyObject?] = 2 values {
  [0] = "a"
  [1] = (instance_type = 0x00007fff7bc2c140 @"")
}
Run Code Online (Sandbox Code Playgroud)

我没有合并选项,但这次我选择了.为什么?

斯威夫特编程语言a ?? b是简写a != nil ? a! : b,但是当我尝试,我得到了非自选的数组:

  6> k.map {$0 != nil ? $0! : ""}
$R2: [AnyObject] = 2 values {
  [0] = "a"
  [1] = ""
}
Run Code Online (Sandbox Code Playgroud)

我误解了??应该如何运作?这里发生了什么?

J. *_*coe 0

我注意到 Apple 认为这是 Swift 2 中的一个错误。

在 Swift 3 中,上面的第一个示例仍然有效,而第二个和第三个示例是无效语法(有或没有 Foundation 桥接)。

将声明替换AnyObjectAnyWorks: a ?? bthen 的行为与 相同a != nil ? a! : b,如文档所述。