迭代NSSet并强制转换为一步

时间:2016-04-30 11:08:30

标签: swift

有没有办法从NSSet(或任何非本机Swift集合)中转换元素,并在一个步骤中将每个元素强制转换为类型。目前我正在做这个

// "zoo" is an NSOrderedSet
for animal in zoo {
  if let animal = animal as? Animal {
    if animal.needFeeding {
      // Feed the animal
    }
  }
}
以上看起来有点笨拙。该集来自CoreData,所以我必须使用NSSet。

3 个答案:

答案 0 :(得分:21)

您可以在case let循环中使用模式匹配for

for case let animal as Animal in zoo  {
    if animal.needFeeding {

    }
}

请注意,这只会跳过不是实例的元素 (Animal的子类。

答案 1 :(得分:3)

为了完整性,NSOrderedSet只是一个集合和数组的组合,您可以使用其中任何一个进行迭代,将其转换为Swift SetArray类型:

for animal in zoo.set as! Set<Animal> {
    if animal.needFeeding {
    }
}

for animal in zoo.array as! [Animal] {
    if animal.needFeeding {
    }
}

答案 2 :(得分:2)

对于NSOrderedSet等,我会安全地循环遍历映射的内容,如下所示:

for animal in zoo.flatMap({ $0 as? Animal }) {
    if animal.needFeeding {
        // Feed the animal
    }
}

啊,当然,还有类似的Q&amp; A ......我已经回答了类似的问题。但是,在另一个中有更多替代方案:https://stackoverflow.com/a/35558210/2227743