如何在swift中迭代数组并同时检查元素类型?
我想知道是否有可能在数组上进行迭代,并检查当前元素是否具有某种类型。 一个用例是:我有一个带有如何在swift中迭代数组并同时检查元素类型?,swift,loops,syntax,Swift,Loops,Syntax,我想知道是否有可能在数组上进行迭代,并检查当前元素是否具有某种类型。 一个用例是:我有一个带有NSDictionarys和NSArrays的数组,我只想处理NSDictionarys 我希望在循环中没有条件的情况下执行此操作: for entity in array { if entity is NSDictionary { // Do something } } 我要找的东西是: for (entity in array) as? NSDictiona
NSDictionary
s和NSArray
s的数组,我只想处理NSDictionary
s
我希望在循环中没有条件的情况下执行此操作:
for entity in array
{
if entity is NSDictionary
{
// Do something
}
}
我要找的东西是:
for (entity in array) as? NSDictionary
{
// Do something
}
当然我知道我刚写的东西不管用,但我想你可以理解我的要求
任何想法都将不胜感激 解决方案1
你可以过滤你的数组
let things = [NSDictionary(), NSArray(), NSDictionary(), NSArray()]
let dicts = things.flatMap { $0 as? NSDictionary }
现在,dicts
被定义为[NSDictionary]
an只包含两个字典
解决方案2
您还可以仅对作为字典的值执行for循环
let things = [NSDictionary(), NSArray(), NSDictionary(), NSArray()]
for dict in things.flatMap( { $0 as? NSDictionary }) {
}
解决方案1
你可以过滤你的数组
let things = [NSDictionary(), NSArray(), NSDictionary(), NSArray()]
let dicts = things.flatMap { $0 as? NSDictionary }
现在,dicts
被定义为[NSDictionary]
an只包含两个字典
解决方案2
您还可以仅对作为字典的值执行for循环
let things = [NSDictionary(), NSArray(), NSDictionary(), NSArray()]
for dict in things.flatMap( { $0 as? NSDictionary }) {
}
如果不希望元素具有与原始数组中相同的索引,则可以将
flatMap
映射到所需的类型
for element in array.flatMap({ $0 as? NSDictionary }) {
// do something
}
如果不希望元素具有与原始数组中相同的索引,则可以将
flatMap
映射到所需的类型
for element in array.flatMap({ $0 as? NSDictionary }) {
// do something
}
使用过滤器
和类型检查运算符是
作为flatMap
解决方案的替代方案,您可以使用filter
以及类型检查操作符is
:
let arr: [AnyObject] = [NSDictionary(), ["foo", "bar"], NSDictionary(), "foo"]
for dict in arr.filter({ $0 is NSDictionary }) {
// do something with dictionary
}
使用类型检查运算符(is
)检查实例是否为
某个子类类型。如果
实例属于该子类类型,如果不是,则为false
从。由于您不必担心子类匹配问题(您知道元素是NSDictionary
或NSArray
),因此is
过滤方法在这里是一种合适的替代方法
请注意,当使用flatMap
和类型转换操作符(as
)时,for
循环(dict
)中的迭代元素将是类型NSDictionary
,而上面的filter
方法将不执行向下转换,因此将NSDictionary
保存为其包装形式,作为AnyObject
。这里可能更喜欢flatMap
方法。使用filter
和类型检查操作符是
作为flatMap
解决方案的替代方案,您可以使用filter
以及类型检查操作符is
:
let arr: [AnyObject] = [NSDictionary(), ["foo", "bar"], NSDictionary(), "foo"]
for dict in arr.filter({ $0 is NSDictionary }) {
// do something with dictionary
}
使用类型检查运算符(is
)检查实例是否为
某个子类类型。如果
实例属于该子类类型,如果不是,则为false
从。由于您不必担心子类匹配问题(您知道元素是NSDictionary
或NSArray
),因此is
过滤方法在这里是一种合适的替代方法
请注意,当使用flatMap
和类型转换操作符(as
)时,for
循环(dict
)中的迭代元素将是类型NSDictionary
,而上面的filter
方法将不执行向下转换,因此将NSDictionary
保存为其包装形式,作为AnyObject
。可能这里更喜欢flatMap
方法。非常感谢,第二种解决方案正是我想要的@AlexanderMomchliov:嗨,Alexander,问题是如果不将整个条件包装成(…)
@appzyorlife,你就不能在IF条件中使用尾随闭包语法哦,你是对的!我想这是有道理的。我认为编译器可以在没有它的情况下工作,但它可能不值得这么做。非常感谢,第二个解决方案正是我所寻找的@AlexanderMomchliov:嗨,Alexander,问题是如果不将整个条件包装成(…)
@appzyorlife,你就不能在IF条件中使用尾随闭包语法哦,你是对的!我想这是有道理的。我认为编译器可以在没有它的情况下工作,但它可能不值得工作谢谢,它也可以工作谢谢,它也可以工作在你的情况下它将是对于case let entity as NSDictionary in array{…}
,它精确地枚举数组中NSDictionary类型的元素,不创建中间过滤数组。在您的情况下,对于数组{…}
中的NSDictionary这样的case let实体,它将是,它精确地枚举数组中NSDictionary类型的元素,而不创建中间过滤数组。