Swift:将值“[T]?”赋给`[T?]`类型的变量时出现运行时错误

时间:2015-11-12 17:43:29

标签: arrays swift optional

有没有什么办法可以为一个期望非可选数组的可选类型的变量赋一个可选的非可选类型数组?

受挫的例子:

var a: [T]?
let thing: T = T()
a = [thing]

var b: [T?] = []
if a != nil {
    b = a!
}

编译器没有抱怨,但在运行时我收到的fatal error: array cannot be bridged from Objective-C我推断的是来自作业b = a!中的冲突类型。

我是否可能缺少对Swift的一些基本理解,这会使尝试这样的任务变得愚蠢或不必要?

3 个答案:

答案 0 :(得分:1)

Swift中的Optionals实际上是枚举,如:

rm

关于选项的所有操作(例如使用enum Optional<Wrapped> { case None case Some(Wrapped) } ?等)都是Swift提供的简易操作,以便于使用和理解。

数组实际上也是通用结构,如:

!
声明的

struct Array<Element> { // ... } 语法也是(Apple推荐)的简写。

现在,如果你看看[][Int?]真正归结为什么,你会发现它们完全不同:

[Int]?

现在,为了将一个分配到另一个,您必须提供一些转换代码。例如。像这样的东西:

let foo = Array<Optional<Int>>()     // [Int?]
let bar: Optional<Array<Int>> = nil  // [Int]?

在上面的代码let foo: [Int]? = [1, 2, 3] var bar: [Int?] = [] bar = (foo ?? []).map() { $0 } 中展开可选数组,提供一个空数组作为(foo ?? []) case的替代,然后nil函数将非选项数组映射到可选数组(Swift会自动为您推断非可选转换)。

答案 1 :(得分:1)

这应该清楚了:

  • [T]Array<T>
  • 的语法糖
  • T?Optional<T>
  • 的语法糖
  • [T?]Array<Optional<T>>
  • 的语法糖
  • [T]?Optional<Array<T>>
  • 的语法糖

[T]?表示阵列可能/可能不会存在。如果是,则它将是Array<T>类型的数组。如果不是,那就是它。

我假设你要找的是a ?? []解包a,检查它是否有值,返回当前值或替换[](一个空数组) )。所以你要么得到一个带/不带元素的数组,要么是一个空数组。

答案 2 :(得分:0)

我认为你误解了一些事情。 第一:

[T]? == T的数组是可选的。

[T?] == T的数组? ,一个数组包含可选的T.

当它不是零时,我们可以将a转换为b吗? 是。您始终可以通过map()将[T]转换为[T?]。 在你的情况下,那将是

b = a.map(){ original -> T? in return original }

但如果你想反过来:

a = b.filter { original -> T in return original != nil }