【发布时间】: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
我想在数组中插入一个可选项,如下所示
let arr: AnyObject[] = [1, 2, nil, 4, 5]
以下表达式引发编译错误
Cannot convert the expression's type 'AnyObject[]' to type 'AnyObject'
我怎样才能完成这项工作?即使我知道我不应该,我也需要数组中的可选值或 nil 值。
【问题讨论】:
标签: swift
如果您只想插入 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 保存特定类型但允许它在某些索引中为空,例如一盒鸡蛋。)
【讨论】:
就像这样:
let arr: AnyObject?[] = [1, 2, nil, 4, 5]
它生成AnyObject? 类型的数组
【讨论】:
你不能使用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 将不起作用。
【讨论】:
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]
【讨论】:
这是一种作弊,但如果您将 nil 用作哨兵,则建议只使用元组,其中一个元素是 Bool 来表示第二个的有效性。
var arr = [(true, 1), (true, 2) , (false, 0) , (true, 4),(true,5)]
【讨论】: