Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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-for循环中的模式匹配_Swift_Pattern Matching - Fatal编程技术网

Swift-for循环中的模式匹配

Swift-for循环中的模式匹配,swift,pattern-matching,Swift,Pattern Matching,似乎应该有一种“更快捷”的方法来实现这一点,但我仍然在思考用Swift进行模式匹配的各种方法 假设我有一个AnyObject数组,我想循环遍历它,如果项目是Int,Int是5的倍数,那么我想把它打印出来。以下是我的初步方法: let myStuff: [AnyObject] = [5, "dog", 11, 15, "cat"] for item in myStuff { if let myInt = item as? Int where myInt % 5 == 0 {

似乎应该有一种“更快捷”的方法来实现这一点,但我仍然在思考用Swift进行模式匹配的各种方法

假设我有一个AnyObject数组,我想循环遍历它,如果项目是Int,Int是5的倍数,那么我想把它打印出来。以下是我的初步方法:

let myStuff: [AnyObject] = [5, "dog", 11, 15, "cat"]

for item in myStuff {
    if let myInt = item as? Int where myInt % 5 == 0 {
        print ("\(item)")
    }
}
老实说,这还不错……但是使用Swift的所有模式匹配语法,似乎我应该能够将逻辑整合到一行。到目前为止,我还没有找到一种有效的方法,但我希望能够做到以下几点:

//This doesn't work, but I feel like something similar to this should
for item in myStuff where item is Int, item % 5 == 0 {
    print ("\(item)")
}
显然,这不是什么大不了的事,但对我来说,这更像是一种思维练习,可以更好地理解Swift的模式匹配。

您可以将a与
where
子句结合起来,如下所示:

let myStuff: [AnyObject] = [5, "dog", 11, 15, "cat"]

// item will be an Int, and divisible by 5
for case let item as Int in myStuff where item % 5 == 0 {
    print(item)
}

// Prints:
// 5
// 15
是,imho,是“最佳”的一个,也是被接受的一个。但为了便于讨论,作为替代方案,相同的逻辑可以应用于链式功能方法:

let myStuff: [AnyObject] = [5, "dog", 11, 15, "cat"]

myStuff.flatMap{ $0 as? Int }.filter{ $0 % 5 == 0}.forEach {
    print($0)
} /* 5 15 */

没问题@dfri:)啊!我的一次尝试很接近。实际上我已经尝试过:“case-let-item-as?Int…”。我觉得这是对的,因为if语句的语法是:“if let item=something as?Int…。@chrismc Yes,带有可选绑定的条件转换的语法(
if let…as…
)确实不同于带有模式匹配的条件转换的语法。实际上,您可以将if语句重写为
if case let item as Int=something
,尽管这显然比
if let item=something as表达性差?Int
(因此很少见到)。它们不同的原因是,
as?
生成一个可选绑定,然后可选绑定将其打开–但是
as
类型转换模式只是尝试类型转换,如果成功则匹配。