Swift-for循环中的模式匹配
似乎应该有一种“更快捷”的方法来实现这一点,但我仍然在思考用Swift进行模式匹配的各种方法 假设我有一个AnyObject数组,我想循环遍历它,如果项目是Int,Int是5的倍数,那么我想把它打印出来。以下是我的初步方法: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 {
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
类型转换模式只是尝试类型转换,如果成功则匹配。