我有一个对象数组:
var fooArray = [Foo]()
如果我想用 Foo 对象附加另一个数组,我可以使用+=
:
fooArray += anotherFooArray
这个有效。
但是,如果我将数组中的 Foo 对象设为可选:
var fooArray = [Foo?]()
进行连接会引发错误:
[Foo?]() is not identical to 'CGFloat'
我绝对不明白问题出在哪里,CGFloat 类型与此有什么关系?
我有一个对象数组:
var fooArray = [Foo]()
如果我想用 Foo 对象附加另一个数组,我可以使用+=
:
fooArray += anotherFooArray
这个有效。
但是,如果我将数组中的 Foo 对象设为可选:
var fooArray = [Foo?]()
进行连接会引发错误:
[Foo?]() is not identical to 'CGFloat'
我绝对不明白问题出在哪里,CGFloat 类型与此有什么关系?
问题在于Foo
andFoo?
是 2 种不同的类型(可选实际上是Optional<T>
枚举的一个实例)。
为了追加到数组中,元素必须是相同的类型 -Foo
而Optional<Foo>
不是。
您可以通过简单地将数组转换为附加到可选Foo
s 的数组来解决此问题:
fooArray += anotherFooArray as [Foo?]
至于误导性错误消息,我认为它试图应用将+=
CGFloat 作为参数之一的运算符的重载,因为它无法将提供的参数与为数组类型定义的重载匹配。
如果要获取仅包含值而不包含nil
s 的数组,则可以使用reduce
函数创建新数组。
let total: [Foo] = reduce(fooArray, otherArray) { acc, foo in
if let foo = foo {
return acc + [foo]
} else {
return acc
}
}
fooArray
is的类型和is的[Foo?]
类型otherArray
[Foo]
你做错了几件事。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)
}
希望这可以帮助!