有没有办法从NSSet(或任何非本机Swift集合)中转换元素,并在一个步骤中将每个元素强制转换为类型。目前我正在做这个
// "zoo" is an NSOrderedSet
for animal in zoo {
if let animal = animal as? Animal {
if animal.needFeeding {
// Feed the animal
}
}
}
以上看起来有点笨拙。该集来自CoreData,所以我必须使用NSSet。
答案 0 :(得分:21)
您可以在case let
循环中使用模式匹配for
:
for case let animal as Animal in zoo {
if animal.needFeeding {
}
}
请注意,这只会跳过不是实例的元素
(Animal
的子类。
答案 1 :(得分:3)
为了完整性,NSOrderedSet
只是一个集合和数组的组合,您可以使用其中任何一个进行迭代,将其转换为Swift Set
或Array
类型:
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