如何在Swift中包含数组中的可选项

时间:2014-06-07 00:42:50

标签: swift

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

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

以下表达式抛出编译错误

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

我怎样才能做到这一点?我需要数组中的可选值或零值,即使我知道我不应该。

5 个答案:

答案 0 :(得分:17)

如果您要插入Intnil,请使用

Swift< 2.0

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

Swift> = 2.0

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

Swift 3x

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

这可以针对任何类型进行(不仅仅是Int;也就是说,如果您希望array保留特定类型但允许其在某些索引中为空,例如鸡蛋。)

答案 1 :(得分:6)

就像这样:

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

它使类型为AnyObject?

的数组

答案 2 :(得分:4)

您无法使用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任何可以表示任何类型的实例,除了函数类型。“

     

摘自:Apple Inc.“The Swift Programming Language。”iBooks。   https://itun.es/us/jEUH0.l

似乎Int和其他原始类型可能不是类类型的子类型,因此AnyObject无法工作。

答案 3 :(得分:3)

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]

答案 4 :(得分:1)

它是一个骗子,但是如果你使用nil作为哨兵,建议只使用元组,一个元素是Bool来代表第二个的有效性。< / p>

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