使用“+=”运算符将一个数组连接到另一个可选值数组

Concatenating an array to another optional values array with the “+=” operator

我有一个对象数组:

var fooArray = [Foo]()

如果我想用 Foo 对象附加另一个数组,我可以使用 += :

fooArray += anotherFooArray

这个有效。

但是如果我将数组中的 Foo 对象设为可选:

var fooArray = [Foo?]()

进行串联会引发错误:

[Foo?]() is not identical to 'CGFloat'

我完全不明白这是什么问题以及 CGFloat 类型与此有什么关系?

问题是 FooFoo? 是两种不同的类型(可选的实际上是 Optional<T> 枚举的一个实例)。

为了追加到数组中,元素必须是同一类型 - FooOptional<Foo> 不是。

您可以通过简单地将数组附加到可选 Foos:

的数组来解决这个问题
fooArray += anotherFooArray as [Foo?]

至于误导性错误消息,我认为它试图应用 += 运算符的重载,将 CGFloat 作为参数之一,因为它无法将提供的参数与重载相匹配为数组类型定义。

你做错了几件事。 Swift 中的数组声明如下:

var array = []

此外,如果您想让数组中的对象成为可选对象,则您传递的对象也应该是可选的:

class Goal {}

var goal1: Goal?
var goal2: Goal?
var goal3: Goal?
var goal4: Goal?

goal2 = Goal() // Initialized
goal4 = Goal() // Initialized

var array = [goal1?, goal2?, goal3?]

向数组添加新对象是通过附加它来完成的:

array.append(goal4?)

此示例数组具有 [nil, Goal, nil, Goal],因为目标 2 和 4 已初始化,其余为 nil。如果您只想将对象添加到数组中,请使用绑定:

let goal1 = goal1 {
    array.append(goal1)
}

希望对您有所帮助!

如果你想获得只包含值而不是 nil 的数组,你可以使用 reduce 函数来创建新数组。

let total: [Foo] = reduce(fooArray, otherArray) { acc, foo in
  if let foo = foo {
    return acc + [foo]
  } else {
    return acc
  }
}

fooArray 的类型是 [Foo?]otherArray 的类型是 [Foo]