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
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)
@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)
| 归档时间: |
|
| 查看次数: |
755 次 |
| 最近记录: |