为什么 (Array<Character> = []) 是 Array<Bool> == true

Why (Array<Character> = []) is Array<Bool> == true

如果定义的数组为空,为什么数组里面的数据类型不起作用

我创建了一个空的字符数组,我很困惑为什么 a is Array<Bool> 的结果是 true

其实我试过a is Array<T> (T: Bool, String, Int...),都是真的

var a: Array<Character> = []

a is Array<Bool>

结果是:

true

经过一番挖掘,我发现这是预期的行为。

Swift 通过尝试将所有源元素向下转换为目标元素类型来检查数组是否可以向下转换。由于空数组不包含任何元素,这意味着将其向下转换为具有不同元素类型的另一个数组总是成功的。

下面是 swift 用于处理 as? 运算符的代码。我怀疑 swift 以不同方式处理 is 运算符。

public func _arrayConditionalCast<SourceElement, TargetElement>(
  _ source: [SourceElement]
) -> [TargetElement]? {
  var successfulCasts = ContiguousArray<TargetElement>()
  successfulCasts.reserveCapacity(source.count)
  for element in source {
    if let casted = element as? TargetElement {
      successfulCasts.append(casted)
    } else {
      return nil
    }
  }
  return Array(successfulCasts)
}

https://github.com/apple/swift/blob/main/stdlib/public/core/ArrayCast.swift(第 74 行)

来源

类似的错误报告 swift.org:SR-7738

一些令人信服的解释:SR-6192