Swift开发:如何从字典匹配值中返回合并后的单个字符串?
我来帮你搞定这个字符串拼接的问题!
首先得指出你当前代码的核心问题:每次循环找到对应值时,你直接用expectedText = value把之前的结果覆盖了,而不是把新值追加进去。所以循环结束后,expectedText只会保留最后一次匹配到的"2",自然得不到你想要的"12"。
修正方案1:基础循环拼接法
我们可以把expectedText改成非可选的空字符串,然后每次找到值就追加到末尾,同时直接用字典下标访问(比遍历整个字典高效太多):
let letterDict = ["a": "1", "b": "2", "c": "3", "d": "4"] let characterArray = ["a", "b"] func convertText(_ input: String) -> String { var expectedText = "" for character in characterArray { // 直接通过键取值,避免遍历整个字典 if let value = letterDict[character] { expectedText += value } } // 如果没有匹配到任何值,返回默认的input return expectedText.isEmpty ? input : expectedText } // 测试调用 print(convertText("default")) // 输出:12
修正方案2:Swift函数式风格写法(更简洁)
用compactMap过滤出字典中存在的对应值,再用joined()拼接成字符串,这是Swift里更优雅的写法:
func convertText(_ input: String) -> String { // compactMap自动过滤掉字典中不存在的键(也就是nil值),得到非可选的字符串数组 let result = characterArray.compactMap { letterDict[$0] }.joined() return result.isEmpty ? input : result }
为什么你之前用map/joined会得到nil?
大概率是你用了map而不是compactMap:如果characterArray里有字典不存在的键,map会返回一个包含nil的数组,而joined()无法处理带可选值的数组,导致你拿到nil。而compactMap会自动剔除nil,返回纯字符串数组,再调用joined()就可以正常拼接了。
内容的提问来源于stack exchange,提问作者fankibiber
相关产品推荐
相关产品推荐

