我有一个对象数组:
var fooArray = [Foo]()
如果我想用Foo对象追加另一个数组,我可以使用+=
:
fooArray += anotherFooArray
这个有效。
但如果我让数组中的Foo对象可选:
var fooArray = [Foo?]()
进行连接会引发错误:
[Foo?]() is not identical to 'CGFloat'
我绝对不明白问题是什么以及CGFloat类型与此有什么关系?
答案 0 :(得分:3)
问题是Foo
和Foo?
是两种不同的类型(可选实际上是Optional<T>
枚举的实例)。
为了追加到数组中,元素必须属于同一类型 - Foo
且Optional<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]