【问题标题】: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 类型与此有什么关系?

【问题讨论】:

    标签: arrays swift optional-values


    【解决方案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]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-03
        • 2023-01-25
        • 1970-01-01
        • 1970-01-01
        • 2012-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多