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

时间:2015-01-15 16:02:36

标签: arrays swift optional-values

我有一个对象数组:

var fooArray = [Foo]()

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

fooArray += anotherFooArray

这个有效。

但如果我让数组中的Foo对象可选:

var fooArray = [Foo?]()

进行连接会引发错误:

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

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

3 个答案:

答案 0 :(得分:3)

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

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

您可以通过简单地将数组转换为附加到可选Foo s的数组来解决问题:

fooArray += anotherFooArray as [Foo?]

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

答案 1 :(得分:0)

你做错了几件事。 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初始化,其余为零。如果要将对象添加到数组中,只有它存在时才使用绑定:

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

希望这有帮助!

答案 2 :(得分:0)

如果要获取仅包含值而不是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]