Swift for循环中的模式匹配

chr*_*smc 4 pattern-matching swift

似乎应该有一个"更快"的方式来做到这一点 - 但我仍然围绕着在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)")
    }
}
Run Code Online (Sandbox Code Playgroud)

老实说,这还不错......但是使用Swift的所有模式匹配语法,似乎我应该能够将逻辑合并到1行.到目前为止,我还没有找到一种有效的方法 - 但我希望能够做到这样的事情:

//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)")
}
Run Code Online (Sandbox Code Playgroud)

显然,这不是一个大问题 - 但对于我来说,理解斯威夫特的模式匹配更好一点是一种思考练习.

Ham*_*ish 10

您可以将匹配条件转换模式与如下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
Run Code Online (Sandbox Code Playgroud)


dfr*_*fri 6

@Hamish的巧妙解决方案是,imho,"最佳" 解决方案,以及被接受的解决方案.但是为了讨论,作为替代方案,可以使用链式功能方法应用稍微相同的逻辑:

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

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