使用“+=”运算符将数组连接到另一个可选值数组
Posted
技术标签:
【中文标题】使用“+=”运算符将数组连接到另一个可选值数组【英文标题】:Concatenating an array to another optional values array with the “+=” operator 【发布时间】:2015-01-15 16:02:35 【问题描述】:我有一个对象数组:
var fooArray = [Foo]()
如果我想用 Foo 对象附加另一个数组,我可以使用 +=
:
fooArray += anotherFooArray
这个有效。
但如果我将数组中的 Foo 对象设为可选:
var fooArray = [Foo?]()
进行连接会引发错误:
[Foo?]() is not identical to 'CGFloat'
我绝对不明白问题出在哪里,CGFloat 类型与此有什么关系?
【问题讨论】:
【参考方案1】:问题在于Foo
和Foo?
是两种不同的类型(可选实际上是Optional<T>
枚举的一个实例)。
为了追加到数组中,元素必须是相同的类型 - Foo
和 Optional<Foo>
不是。
您可以通过简单地将数组转换为附加到可选Foo
s 的数组来解决此问题:
fooArray += anotherFooArray as [Foo?]
至于误导性错误消息,我认为它试图应用 +=
运算符的重载,将 CGFloat 作为参数之一,因为它无法将提供的参数与为数组定义的重载匹配输入。
【讨论】:
【参考方案2】:你做错了几件事。 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)
希望这会有所帮助!
【讨论】:
我的数组声明没有任何问题,你的例子有点糟糕,不要回答我的问题。您应该阅读 Antonio 的回答和一些快速的文档。【参考方案3】:如果您想获取仅包含值而不包含 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]
【讨论】:
以上是关于使用“+=”运算符将数组连接到另一个可选值数组的主要内容,如果未能解决你的问题,请参考以下文章