Swift 遍历混合类型的对象数组

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

我正在尝试一些非常简单的事情(至少在ObjC中)

我想遍历一个集合,比如说一个字符串数组和子数组,打印所有字符串并递归调用函数遍历任何子数组

我试过这样的方法:

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