Swift 遍历混合类型的对象数组
我正在尝试一些非常简单的事情(至少在ObjC中) 我想遍历一个集合,比如说一个字符串数组和子数组,打印所有字符串并递归调用函数遍历任何子数组 我试过这样的方法:Swift 遍历混合类型的对象数组,swift,swift-playground,Swift,Swift Playground,我正在尝试一些非常简单的事情(至少在ObjC中) 我想遍历一个集合,比如说一个字符串数组和子数组,打印所有字符串并递归调用函数遍历任何子数组 我试过这样的方法: func traverseCollection<T : Sequence>(collection: T) { var generator = collection.generate() while let item = generator.next() { if let collect
func traverseCollection<T : Sequence>(collection: T)
{
var generator = collection.generate()
while let item = generator.next()
{
if let collectionItem = item as? Collection
{
traverseCollection(collectionItem)
}
else
{
println("item:", item)
}
}
}
我想我试图用错误的方法来解决这个问题,但我不知道如何用Swift来解决这个问题。如果有人能给我指出正确的方向,那就太好了。首先,你的第二个例子显然是一个编译器错误,请报告在 这不是一个“纯粹”的swift解决方案,但它是有效的:
import Foundation
var array : NSArray = [1, 2, [3, 4]]
func printElements(array: NSArray) {
for item : AnyObject in array {
if let itemArray = item as? NSArray {
printElements(itemArray)
} else {
println("\(item)")
}
}
}
printElements(array)
我会做一个动态的解决方案,而不是递归的,因为我不想冒险用不确定数量的递归调用使堆栈溢出
func printArray(array: Array<AnyObject>) -> () {
var dynamicCollection: Array<AnyObject> = array
dynamicCollection.unshare()
do {
let firstObject: AnyObject = dynamicCollection[0]
if let myString: String = firstObject as? String {
println(myString)
} else if let myArray: Array<AnyObject> = firstObject as? Array {
dynamicCollection += myArray
}
dynamicCollection.removeAtIndex(0)
} while dynamicCollection.count > 0
}
在我的控制台上,结果如下所示:
string1
string2
subString1
subString2
moreSubString1
justSubString1
deepSubString1
deepSubString2
我喜欢这个解决方案,它确实能解决我的问题。仍然不知道我的递归方法为什么失败。谢谢
func printArray(array: Array<AnyObject>) -> () {
var dynamicCollection: Array<AnyObject> = array
dynamicCollection.unshare()
do {
let firstObject: AnyObject = dynamicCollection[0]
if let myString: String = firstObject as? String {
println(myString)
} else if let myArray: Array<AnyObject> = firstObject as? Array {
dynamicCollection += myArray
}
dynamicCollection.removeAtIndex(0)
} while dynamicCollection.count > 0
}
let myArray : Array<AnyObject> = ["string1", ["subString1", "subString2"], ["moreSubString1"], "string2", [["deepSubString1", "deepSubString2"], "justSubString1"]]
string1
string2
subString1
subString2
moreSubString1
justSubString1
deepSubString1
deepSubString2