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