Swift阻止使用Array.append

Swift阻止使用Array.append,swift,Swift,我正在编写一个自己的类来解析一些xml文档。因此,我使用libxml。我创建了一个XMLDocument类和一个XMLNode类。我写了一些函数,比如“elementsForName”等等。最后,当我解析巨大的xml文档时,整个项目在iPad3上运行的速度非常慢。我试图用“仪器”的“时间分析器”找出问题所在 问题在于Swift如何处理数组。我有一个名为func elementsForName(名称:String)->[MyXMLNode]的函数?{。在这个方法中,我循环给定节点的所有子节点。我比

我正在编写一个自己的类来解析一些xml文档。因此,我使用libxml。我创建了一个XMLDocument类和一个XMLNode类。我写了一些函数,比如“elementsForName”等等。最后,当我解析巨大的xml文档时,整个项目在iPad3上运行的速度非常慢。我试图用“仪器”的“时间分析器”找出问题所在

问题在于Swift如何处理数组。我有一个名为
func elementsForName(名称:String)->[MyXMLNode]的函数?{
。在这个方法中,我循环给定节点的所有子节点。我比较节点类型和节点名称。如果它与“name”字符串相同,我将创建MyXMLNode类的新实例并将其附加到数组中。问题是,附加到数组中会调整数组的大小,因此Swift将复制整个数组。这需要一个l最后我发现了这个有用的线索:)

以下是我的方法:

func elementsForName(name: String) -> [MyXMLNode]? {
    var children = [MyXMLNode]()
    var currentNode = nodePointer!.memory.children
    while currentNode != nil {
        let tag = String.fromCString(CString(UnsafePointer<xmlChar>(currentNode.memory.name)))
        if currentNode.memory.type.value == 1 && tag == name {
            children.append(MyXMLNode(xmlNodePointer: currentNode))
        }

        currentNode = currentNode.memory.next
    }

    if children.count == 0 {
        return nil
    }

    return children
}
func elementsForName(名称:String)->[MyXMLNode]{
var children=[MyXMLNode]()
var currentNode=nodepenter!.memory.children
而currentNode!=nil{
让tag=String.fromCString(CString(UnsafePointer(currentNode.memory.name)))
如果currentNode.memory.type.value==1&&tag==name{
append(MyXMLNode(xmlnodepenter:currentNode))
}
currentNode=currentNode.memory.next
}
如果children.count==0{
归零
}
返回儿童
}
我曾考虑过创建一个具有给定容量的数组,但在结束循环之前,我不知道将找到给定名称的多少元素


有什么想法吗?

您可以通过使用其他现有的Swift数组方法(如
Array.filter()
Array.map()
)来阻止使用
Array.append()
。例如:

nodes.filter { 
    let tag = ...
    return $0.memory.type.value == 1 && tag == name
  }.map { (cn:Node) in MyXMLNode(xmlNodePointer:  cn) }}

为什么不使用链表数据结构呢?简单、功能强大,而且完全符合您的需要。链表在插入元素时的速度并不十分快…@JoJoe,在链表末尾插入新元素是O(1)。有什么问题吗?我真傻,我在考虑一般访问元素,也就是O(n).你说得对。你有链表的例子吗?(特别是我可以用[I]访问的链表)谢谢你的回答。我只是不太明白filter()和map()是做什么的(我会读到)。但在您的示例中,“节点”是什么?
Node
currentNode
的类型,可能是
MyXMLNode
?在Swift中,函数如
filter()
map()
对于给定的闭包非常重要。