1

我有一个对象数组:

var fooArray = [Foo]()

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

fooArray += anotherFooArray

这个有效。

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

var fooArray = [Foo?]()

进行连接会引发错误:

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

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

4

3 回答 3

3

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

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

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

fooArray += anotherFooArray as [Foo?]

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

于 2015-01-15T16:12:51.247 回答
0

如果要获取仅包含值而不包含nils 的数组,则可以使用reduce函数创建新数组。

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

fooArrayis的类型和is的[Foo?]类型otherArray[Foo]

于 2015-01-15T21:38:41.517 回答
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 已初始化,其余为 nil。如果您只想在数组存在的情况下将对象添加到数组中,请使用绑定:

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

希望这可以帮助!

于 2015-01-15T16:25:01.740 回答