swift - 在 Swift 中替换索引处的字符
问题描述
我目前正在用 Swift 制作一个刽子手游戏。
游戏随机生成一个单词,用户必须猜测。
用户一次输入猜测一个字母。如果猜测是正确的,那么该字母应该在空字符串中显示。
例如,如果单词是 APPLE,则字符串开头为:
_ _ _ _ _。
如果用户猜到了字母 A,那么该字符串将向用户显示为:
一个 _ _ _ _。
我实现这个的方式是有两个字符串变量,stringToGuess 和 stringToDisplay。stringToGuess 是完整的单词 (APPLE),要显示的字符串是带下划线的单词 (A _ _ _ _)。
到目前为止,我已经编写了这段代码。它无法编译,因为数组运算符 [] 在字符串上是只读的。
在索引处替换字符的最佳方法是什么?
let buttonCharacter = sender.currentTitle!
if(wordToGuess.contains(buttonCharacter)) {
for(i, character) in wordToGuess.enumerated() {
if(buttonCharacter.first == character) {
wordToDisplay[i] = character
}
}
}
解决方案
您可以过滤包含猜测字符的 stringToGuess 的索引,并使用这些索引替换 stringToDisplay 对应的字符:
extension StringProtocol where Self: RangeReplaceableCollection {
@discardableResult
mutating func replaceOccurrences<S: StringProtocol>(of character: Character, in string: S) -> Bool {
precondition(count == string.count)
var found = false
string.indices.filter {
string[$0] == character
}.forEach {
found = true
replaceSubrange($0...$0, with: CollectionOfOne(character))
}
return found
}
}
游乐场测试:
let stringToGuess = "APPLE"
var stringToDisplay = String(repeating: "_", count: stringToGuess.count)
var guess: Character = "A"
if stringToDisplay.replaceOccurrences(of: guess, in: stringToGuess) {
print("Hangman:", stringToDisplay) // "Hangman: A____\n"
} else {
print("Character \(guess) not found on \(stringToGuess)")
}
guess = "E"
if stringToDisplay.replaceOccurrences(of: guess, in: stringToGuess) {
print("Hangman:", stringToDisplay) // "Hangman: A___E\n"
} else {
print("Character \(guess) not found on \(stringToGuess)")
}
guess = "I"
if stringToDisplay.replaceOccurrences(of: guess, in: stringToGuess) {
print("Hangman:", stringToDisplay) // "Hangman: A___E\n"
} else {
print("Character \(guess) not found on \(stringToGuess)")
}
guess = "P"
if stringToDisplay.replaceOccurrences(of: guess, in: stringToGuess) {
print("Hangman:", stringToDisplay) // "Hangman: APP_E\n"
} else {
print("Character \(guess) not found on \(stringToGuess)")
}
guess = "L"
if stringToDisplay.replaceOccurrences(of: guess, in: stringToGuess) {
print("Hangman:", stringToDisplay) // "Hangman: APPLE\n""""
} else {
print("Character \(guess) not found on \(stringToGuess)")
}
这将打印
刽子手:A___
刽子手:A___E
我在 APPLE 上找不到的字符
刽子手:APP_E
刽子手:苹果
推荐阅读
- javascript - d3渲染中的折线图但不显示
- javascript - 不渲染 instagram、twitter 等嵌入 angular
- azure-webjobs - 无法使连续 Azure Webjob 成为单例
- html - 在 NetSuite 中向库存项目添加图像
- sql-server - SSIS 2016 投标连接部署问题
- postgresql - 我怎样才能从某个日期/时间*下载我的 heroku DB 的副本?
- html - 如何宣布网站不支持屏幕阅读器?
- c# - OpenXML 文件在 Excel 中打开时需要修复
- python - 线程如何共享对实例的引用?
- docusignapi - DocuSign API - 帐户用户之间的信封共享