根据Apple的官方书籍#34; Swift编程语言(Swift 2.1)":
- AnyObject可以表示任何类类型的实例。
- 任何可以表示任何类型的实例,包括函数类型。
知道这一点,我想使用Any
数组模拟类似Python的嵌套列表。
let array = [1, 2, [3, 4], [5, 6, [7, 8]], 1]
由于Int
和Array
是值类型,我认为array
将被键入为[Any]
但这并非如此:
func flatten(list:[Any]) -> [Any] {
var new = [Any]()
for element in list {
if let array = element as? [Any] {
// this code never runs
let flattened = flatten(array)
for x in flattened {
new.append(y)
}
}else{
new.append(element)
}
}
return new
}
注意:首先调用此函数会给我EXC_BAD_INSTRUCTION
错误,直到我做了这个调整:
let array : [Any] = [1, 2, [3, 4], [5, 6, [7, 8]], 1]
Output : [1, 2, [3, 4], [5, 6, [7, 8]], 1]
Expected : [1, 2, 3, 4, 5, 6, 7, 8, 1]
我通过Any
AnyObject
中的所有位置
现在的数字类型为NSNumber
func flatten(list:[AnyObject]) -> [AnyObject] {
var new = [AnyObject]()
for element in list {
if let array = element as? [AnyObject] {
let flattened = flatten(array)
for x in flattened {
new.append(y)
}
}else{
new.append(element)
}
}
return new
}
Output : [1, 2, 3, 4, 5, 6, 7, 8, 1]
Expected : [1, 2, 3, 4, 5, 6, 7, 8, 1]
为什么它与[AnyObject]
/ NSArray
合作而不与[Any]
一起使用,尽管整数文字主要是Int
类型而不是NSNumber
和数组文字的类型为Array
而不是NSArray
? 我的例子有问题吗?
答案 0 :(得分:0)
当你使用Any
时,Swift会将你的嵌套数组元素包装到NSArray中而不包含在Swift数组中(它不能包含所有Objective-C类型)。因此,如果您使用if let array = element as? [Any] {
,则您的测试Any
将不会成立,因为生成的数组不是[Any]
类型而是NSArray
。
因此,如果您想要一个管理Any
的功能,您可以更改您的测试:
if let nestedArray = element as? NSArray {
然后,您必须使用NSArray原型定义新的flattenArray()
函数:
func flattenArray(array: NSArray) -> [Any] {
var flattenedArray: [Any] = []
for element in array {
// We have an array
if let nestedArray = element as? NSArray {
flattenedArray = flattenedArray + flattenArray(nestedArray)
} else {
// We have a single element
flattenedArray.append(element)
}
}
return flattenedArray
}
func flattenArray(array: [Any]) -> [Any] {
var flattenedArray: [Any] = []
for element in array {
// We have an array
if let nestedArray = element as? NSArray {
flattenedArray = flattenedArray + flattenArray(nestedArray)
} else {
// We have a single element
flattenedArray.append(element)
}
}
return flattenedArray
}
它会起作用。
我们可以想象一个更优雅的解决方案,但是通过这个例子,您可以了解这个问题背后的想法。