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