如何在 Swift 中遍历 NSMapTable 中的所有项目
Posted
技术标签:
【中文标题】如何在 Swift 中遍历 NSMapTable 中的所有项目【英文标题】:How can I iterate over all items in NSMapTable in Swift 【发布时间】:2014-08-25 14:02:21 【问题描述】:我在 Swift 中尝试这样的事情,但没有工作。 错误是:Type() 不符合 BooleanType 类型
//visibleCollectionReusableHeaderViews is of type NSMapTable!
var enumerator: NSEnumerator = visibleCollectionReusableHeaderViews.objectEnumerator()
var myValue: AnyObject!
while (( myValue = enumerator.nextObject()))
我做错了什么?我不认为我了解如何迭代 NSMapTable,甚至只是获取其中的第一项。
【问题讨论】:
【参考方案1】:在 Swift 中,这是使用条件赋值完成的。
let enumerator = visibleCollectionReusableHeaderViews.objectEnumerator()
while let myValue: AnyObject = enumerator.nextObject()
println(myValue)
注意 myValue 的非可选类型。否则这个循环将是无限的,因为 myValue 继续接受 nil 对象。
【讨论】:
谢谢你这样做了!有任何机会,知道现在有什么方法可以更新 uicollectionview 中的部分吗? myValue 实际上是我的标题可重用视图 UICollectionElementKindSectionHeader 所以我想直观地重绘那里的项目(手动约束需要刷新)。我可以做 uicollectionview.reloaddata() 但它有点慢,当我只需要标题时会重绘整个视图。 @user3379785 好吧,如果您可以重新加载整个部分,您可以使用collectionView.reloadSections(NSIndexSet(index: someIndexInteger))
,但如果您只对重新加载标题感兴趣,那么我不确定。不过,看起来这里确实探索了一些选项。 ***.com/questions/13831035/…
例如,如果您想在 YourObject 上使用方法,则需要输入 enumator.nextObject() as? YourObject
。【参考方案2】:
或者更清晰、更短的方法(Swift 3):
for key in table.keyEnumerator()
print(key)
for object in table.objectEnumerator() ?? NSEnumerator()
print(object)
【讨论】:
【参考方案3】:在 Swift 3 中,您可以使用 for-in
循环 allObjects
属性:
for myValue in visibleCollectionReusableHeaderViews.allObjects
// do stuff
【讨论】:
与使用while
循环相比,这不会对性能产生相当大的影响吗?
for-in
循环更快,因为它可以有效地并行化。所以,如果你想在循环中做一些真正成本高昂的事情,这种方式应该是首选。但我们不知道,allObjects
属性是如何组成的。可能,调用此属性可能会导致开销。但我认为,NSMapTable
无论如何都有一个数组,当我们访问allObjects
时,我们真的得到了一个不可变的副本。这样的操作不应该很昂贵。
NSMapTable
没有成员 allObjects
@AndreasLey,真的,这是NSHashTable
的属性。
@kelin 但allObjects
不是NSMapTable
的属性,这是本问题所讨论的内容以上是关于如何在 Swift 中遍历 NSMapTable 中的所有项目的主要内容,如果未能解决你的问题,请参考以下文章
设置 CDEPersistentStoreEnsemble 给出 [NSMapTable cde_strongToStrongObjectsMapTable]: