【问题标题】:How can I iterate over all items in NSMapTable in Swift如何在 Swift 中遍历 NSMapTable 中的所有项目
【发布时间】: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,甚至只是获取其中的第一项。

【问题讨论】:

    标签: ios swift


    【解决方案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)),但如果您只对重新加载标题感兴趣,那么我不确定。不过,看起来这里确实探索了一些选项。 stackoverflow.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 的属性,这是本问题所讨论的内容
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多