【问题标题】:How to include optional in array in Swift如何在 Swift 中的数组中包含可选项
【发布时间】:2014-06-07 00:42:50
【问题描述】:

我想在数组中插入一个可选项,如下所示

let arr: AnyObject[] = [1, 2, nil, 4, 5]

以下表达式引发编译错误

Cannot convert the expression's type 'AnyObject[]' to type 'AnyObject'

我怎样才能完成这项工作?即使我知道我不应该,我也需要数组中的可选值或 nil 值。

【问题讨论】:

    标签: swift


    【解决方案1】:

    如果您只想插入 Ints 或 nils,请使用

    斯威夫特

    var arr: Int?[] = [1, 2, nil, 4, 5]
    

    斯威夫特 >= 2.0

    var arr: [Int?] = [1, 2, nil, 4, 5]
    

    Swift 3x

    var arr: Array<Int?> = [1, 2, nil, 4, 5]
    

    这可以用于任何类型(不仅仅是Int;也就是说,如果您希望array 保存特定类型但允许它在某些索引中为空,例如一盒鸡蛋。)

    【讨论】:

      【解决方案2】:

      就像这样:

      let arr: AnyObject?[] = [1, 2, nil, 4, 5]
      

      它生成AnyObject? 类型的数组

      【讨论】:

        【解决方案3】:

        你不能使用AnyObject

         18> let ar : AnyObject?[] = [1, 2, nil, 4, 5]
        <REPL>:18:25: error: cannot convert the expression's type 'AnyObject?[]' to type 'AnyObject?'
        let ar : AnyObject?[] = [1, 2, nil, 4, 5]
                                ^~~~~~~~~~~~~~~~~
        

        但是你可以使用Any:

         18> let ar : Any?[] = [1, 2, nil, 4, 5]
        ar: Any?[] = size=5 {
          [0] = Some {
            Some = <read memory from 0x7f8d4b841dc0 failed (0 of 8 bytes read)>
          }
          [1] = Some {
            Some = <read memory from 0x7f8d50da03c0 failed (0 of 8 bytes read)>
          }
          [2] = Some {
            Some = nil
          }
          [3] = Some {
            Some = <read memory from 0x7f8d4be77160 failed (0 of 8 bytes read)>
          }
          [4] = Some {
            Some = <read memory from 0x7f8d4be88480 failed (0 of 8 bytes read)>
          }
        }
        

        Apple 文档明确说明了这一点:

        “Swift 提供了两个特殊的类型别名来处理非特定的 类型:
        o AnyObject 可以表示任何类类型的实例。
        o Any 可以表示任何类型的实例,除了函数类型。”

        摘自:Apple Inc. “Swift 编程语言”。电子书。 https://itun.es/us/jEUH0.l

        看来Int 和可能的其他原始类型不是类类型的子类型,因此AnyObject 将不起作用。

        【讨论】:

          【解决方案4】:

          let ar: AnyObject[] = [1,2,nil,3] 是非法的,因为nil 不能转换为AnyObject

          let a: AnyObject?[] = [1,3,nil,2]let a: Int?[] = [1,3,nil,2] 有效。

          如果您需要一个 Objective-C 可桥接数组,请使用

          let a: AnyObject[] = [1, 2, NSNull(), 4, 5]

          【讨论】:

            【解决方案5】:

            这是一种作弊,但如果您将 nil 用作哨兵,则建议只使用元组,其中一个元素是 Bool 来表示第二个的有效性。

            var arr = [(true, 1), (true, 2) , (false, 0) , (true, 4),(true,5)]
            

            【讨论】:

              猜你喜欢
              • 2021-04-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-08-08
              • 2014-10-29
              • 2018-11-20
              相关资源
              最近更新 更多