我想在数组中插入一个可选项,如下所示
let arr: AnyObject[] = [1, 2, nil, 4, 5]
以下表达式抛出编译错误
Cannot convert the expression's type 'AnyObject[]' to type 'AnyObject'
我怎样才能做到这一点?我需要数组中的可选值或零值,即使我知道我不应该。
答案 0 :(得分:17)
如果您要插入Int
或nil
,请使用
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)]