作为学习练习,我正在尝试使用 for-in 循环 来替换 String
在Array
(带有字典值)如果 String
是 Dictionary
中的现有 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(" ")
这是有效的,因为我正在创建一个新数组并附加到新数组。但是,我的原始数组是可变的,那么为什么第一个解决方案没有正确分配 str
至 val
在原文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/