使用“+=”运算符将数组连接到另一个可选值数组

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】:

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

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

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

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]

【讨论】:

以上是关于使用“+=”运算符将数组连接到另一个可选值数组的主要内容,如果未能解决你的问题,请参考以下文章

将 NumPy 数组连接到另一个 NumPy 数组

如何在没有可选值的情况下将字典数组快速转换为json字符串[重复]

IOS如何将一个数组连接到另一个视图控制器

查找连接到所有给定标签的电影

Swift:“在展开可选值时意外发现 nil”在数组追加中

致命错误:在展开可选值时意外发现 nil(添加到数组时)