首页 > 解决方案 > 在 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
                }
            }
        }

标签: swiftstring

解决方案


您可以过滤包含猜测字符的 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

刽子手:苹果


推荐阅读