我正在尝试一些非常简单的东西(至少在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)
        }
    }
}

但我在尝试向下投射项目时出错了:
无法将“t.GeneratorType.Element”向下转换为非@objc协议类型“collection”
如果让collectionItem=item as?收藏
非通用变量也会失败,并出现编译错误:
func traverseArray(array: Array<Any>)
{
       for item : Any in array
       {
            if let collectionItem = item as? Array<Any>
            {
                traverseArray(collectionItem)
            }
            else
            {
                println("item:", item)
            }
       }
}

要么是操场崩溃要么是编译失败:
Instruction does not dominate all uses!
  %10 = bitcast %swift.opaque* %9 to %Sq.20*, !dbg !235
  %3 = ptrtoint %Sq.20* %10 to i32, !dbg !232
Instruction does not dominate all uses!
  %T = load %swift.type** %3, align 4
  %4 = bitcast %swift.type* %T to i8*, !dbg !232
LLVM ERROR: Broken function found, compilation aborted!

我想我是想用错误的方法来解决问题,但我不知道如何用迅捷的方式来解决。如果有人能把我指向正确的方向,那就太好了。

最佳答案

我将做一个动态的解决方案,而不是递归的解决方案,因为我不想冒险用不确定数量的递归调用溢出堆栈。

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
}

这是我的测试数组,它只包含String和其他Array对象:
let myArray : Array<AnyObject> = ["string1", ["subString1", "subString2"], ["moreSubString1"], "string2", [["deepSubString1", "deepSubString2"], "justSubString1"]]

结果在我的控制台上是这样的:
string1
string2
subString1
subString2
moreSubString1
justSubString1
deepSubString1
deepSubString2

关于swift - 遍历混合类型的对象数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24242496/

10-11 22:14
查看更多