Arrays 使用“+=”;操作人员

Arrays 使用“+=”;操作人员,arrays,swift,optional-values,Arrays,Swift,Optional Values,我有一个对象数组: var fooArray = [Foo]() 如果我想用Foo对象附加另一个数组,我可以使用+=: fooArray += anotherFooArray 这个有效 但是如果我将数组中的Foo对象设置为可选: var fooArray = [Foo?]() 执行串联会引发错误: [Foo?]() is not identical to 'CGFloat' 我绝对不明白问题出在哪里,CGFloat类型与此有什么关系?问题是Foo和Foo?是两种不同的类型(可选的实际上是

我有一个对象数组:

var fooArray = [Foo]()
如果我想用Foo对象附加另一个数组,我可以使用
+=

fooArray += anotherFooArray
这个有效

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

var fooArray = [Foo?]()
执行串联会引发错误:

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

我绝对不明白问题出在哪里,CGFloat类型与此有什么关系?

问题是
Foo
Foo?
是两种不同的类型(可选的实际上是
可选的
枚举的一个实例)

为了附加到数组中,元素必须是相同类型的-
Foo
Optional
不是

您只需将数组强制转换为附加到可选
Foo
s的数组,即可解决此问题:

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
s的数组,可以使用
reduce
函数创建新数组

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

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

我的数组声明中并没有任何错误,您的示例有点糟糕,请不要回答我的问题。你应该阅读安东尼奥的答案和一些快速的文档。