我正在尝试一些非常简单的事情(至少在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&#39;转发。 to non @ objc protocol type&#39; Collection&#39; 如果让collectionItem = item为?集合
一个不太通用的变体也会因编译错误而失败:
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!
我认为我正在尝试解决错误的方法,但我无法弄清楚如何在Swift中使用它。如果有人能指出我正确的方向,那就太好了。
答案 0 :(得分:1)
我会做一个动态的解决方案而不是递归的解决方案,因为我不想冒险用非确定性的递归调用来溢出堆栈。
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
答案 1 :(得分:0)
首先,您拥有的第二个示例显然是编译器错误,请在bugreport.apple.com报告。
这不是一个“纯粹的”快速解决方案,但它有效:
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)