如何在Swift的for循环中用模式匹配提取嵌套数组中的字符串(无需嵌套循环)
解决方案:利用Swift模式匹配提取嵌套数组的首个字符串
嘿,这个需求好办得很!既然已知每个内层数组的首个元素都是字符串,咱们完全可以用Swift的模式匹配特性来实现,根本不需要嵌套for循环~
直接遍历打印的实现
你可以用for case语法直接匹配内层数组的结构,精准提取首个字符串元素:
let arr2 = [["a", true, 1, 5.0], ["b", true, 2, 15.0], ["c", false, 31, 12.0]] // 方式1:明确匹配数组元素个数(适合固定长度的内层数组) for case let [str as String, _, _, _] in arr2 { print(str) // 依次输出 a、b、c } // 方式2:适配任意长度的内层数组(Swift 5.7+支持) for case let [str as String, ..<] in arr2 { print(str) // 同样输出 a、b、c }
解释一下:
_用来忽略数组中不需要的元素,适合内层数组长度固定的场景;..<是Swift 5.7引入的前缀模式,表示匹配首个元素之后的所有元素,不管内层数组有多长都能兼容,灵活性更高。
提取为数组的实现
如果需要把结果收集到一个新数组里,用compactMap结合模式匹配的guard case语法就很高效:
let arr2 = [["a", true, 1, 5.0], ["b", true, 2, 15.0], ["c", false, 31, 12.0]] let extractedStrings = arr2.compactMap { innerArr in guard case let [str as String, ..<] = innerArr else { return nil // 理论上这里不会触发,因为已知首个元素是字符串 } return str } print(extractedStrings) // 输出 ["a", "b", "c"]
这样既简洁又符合Swift的语法特性,完全避开了嵌套循环的写法~
内容的提问来源于stack exchange,提问作者iOSDev
相关产品推荐
相关产品推荐

