Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在swift中迭代数组并同时检查元素类型?_Swift_Loops_Syntax - Fatal编程技术网

如何在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类型的元素,而不创建中间过滤数组。