arrays - Swift 使用 for-in 循环替换数组中的字符串

标签 arrays string swift for-in-loop

作为学习练习,我正在尝试使用 for-in 循环 来替换 StringArray (带有字典值)如果 StringDictionary 中的现有 key .我已经知道如何使用 .stringByReplacingOccurrencesOfString 来做到这一点,但我想了解我在这里做错了什么,以及如何使用 for-in 循环完成此操作。

let sillyMonkeyString = "A monkey stole my iPhone"
let dictionary = ["monkey": "🐒", "iPhone":"📱"]
var toArray = sillyMonkeyString.componentsSeparatedByString(" ")
// desired result is "A 🐒 stole my 📱"

这是不起作用的:

for var str in toArray {
    if let val = dictionary[str] {
        str = val                  
    }
}
let backToString = toArray.joinWithSeparator(" ")

什么有效:

var newArray = [String]()
for var str in toArray {
    if let val = dictionary[str] {
        str = val
    }
    newArray.append(str)
}
let backToString = newArray.joinWithSeparator(" ")

这是有效的,因为我正在创建一个新数组并附加到新数组。但是,我的原始数组可变的,那么为什么第一个解决方案没有正确分配 strval在原文Array在 for-in 循环中?我发现的唯一其他相关问题 here有一个很棒的单行答案,但没有解释我是否可以使用 for-in 循环完成此操作。

更新:我不建议为此特定用例实现 for-in 循环。我问这个问题是为了了解如何做到这一点。如果用户想用字典替换部分字符串,我强烈建议考虑使用下面的一种更高效和 Swifty 的解决方案(这可能不是公认的解决方案)

最佳答案

“纯”Swift(无导入基础)和“功能性”方式导致

let sillyMonkeyString = "A monkey stole my iPhone"
let dictionary = ["monkey": "🐒", "iPhone":"📱"]

let arr = sillyMonkeyString.characters.split(" ").map(String.init)
let result = arr.map { dictionary[$0] ?? $0 }.joinWithSeparator(" ")

print(result)
// A 🐒 stole my 📱

如果需要 for in loop,则

var resArr:[String] = []
for txt in arr {
    resArr.append(dictionary[txt] ?? txt)
}
let result2 = resArr.joinWithSeparator(" ") // A 🐒 stole my 📱"

如果你想要变异的解决方案......

let sillyMonkeyString = "A monkey stole my iPhone"
let dictionary = ["monkey": "🐒", "iPhone":"📱"]

var arr = sillyMonkeyString.characters.split(" ").map(String.init)

for (idx,value) in arr.enumerate() {
    arr[idx] = dictionary[value] ?? value
}
let result3 = arr.joinWithSeparator(" ") // "A 🐒 stole my 📱"

如果你不喜欢 enumerate(),你可以使用索引代替

let sillyMonkeyString = "A monkey stole my iPhone"
let dictionary = ["monkey": "🐒", "iPhone":"📱"]

var arr = sillyMonkeyString.characters.split(" ").map(String.init)

for i in arr.indices {
    arr[i] = dictionary[arr[i]] ?? arr[i]
}
let result4 = arr.joinWithSeparator(" ") // "A 🐒 stole my 📱"

关于arrays - Swift 使用 for-in 循环替换数组中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35802640/

相关文章:

javascript - 返回与另一个对象数组的属性匹配的对象数组的子集

c++ - 巨大的数组导致堆栈溢出

php - 如何将项目添加到可以在另一个页面上访问的javascript数组?

c++ - 为变量与参数中的字符串键入 std::string 的 id?

ios - 保留循环 Swift 闭包

java - 查找三个数组中至少两个数组中存在的数字

c - 释放 Unicode 结构体

c++ - 将文本附加到正则表达式匹配的一部分

ios - 如何使用swift读取iPhone文档目录中的pdf

ios - 将新初始化的 UIImageView 传递给类的属性(类型 UIImageView)是否为 nil?