如何在 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 中的所有项目的主要内容,如果未能解决你的问题,请参考以下文章

NSHashtable and NSMaptable

NSHashtable and NSMaptable

设置 CDEPersistentStoreEnsemble 给出 [NSMapTable cde_strongToStrongObjectsMapTable]:

Swift - 如何遍历 NSDictionary

在 Swift 中,当每对元素都是字符串时,如何遍历一个数组以获取 2 个变量?和一个字符串

Cocoa/Swift:遍历路径中文件夹的名称