【问题标题】:Replacing Character at Index in Swift在 Swift 中替换索引处的字符
【发布时间】:2020-02-09 09:44:48
【问题描述】:

我目前正在用 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
                }
            }
        }

【问题讨论】:

    标签: swift string


    【解决方案1】:

    只有在猜到的字符正确的情况下,您才应该替换除猜到的字符之外的任何内容。所以看看这个:

    var wordToGuess = "Apple"
    
    let selectedCharacters = ["p", "e"]
    
    let wordToDisplay = wordToGuess.map { selectedCharacters.contains(String($0)) ? String($0) : "_" } .joined()
    
    print(wordToDisplay)
    

    每次用户选择一个新字符时,您应该将其添加到selectedCharacters 并再次执行map

    【讨论】:

    • 您可以通过映射字符本身来避免String($0)let wordToDisplay = String(wordToGuess.map { selectedCharacters.contains($0) ? $0 : "_" })。不过,您需要将 selectedCharacters 声明为一个字符数组,这样才能正常工作。
    【解决方案2】:

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

    刽子手:苹果

    【讨论】:

      【解决方案3】:

      由于String 是字符的集合,您可以使用map 将字符转换为原始值,或者如果该字符尚未输入,则转换为“_”:

      func hangman(search: String, typedCharacters: Set<Character>) -> String {
          return String(search.map { typedCharacters.contains($0) ? $0 : "_" })
      }
      

      用户每次输入一个新字母,你只需要将它添加到字符集中即可:

      let search = "APPLE"
      var typedCharacters = Set<Character>()
      
      typedCharacters.insert("A")
      print(hangman(search: search, typedCharacters: typedCharacters)) // A _ _ _ _
      
      typedCharacters.insert("L")
      print(hangman(search: search, typedCharacters: typedCharacters)) // A _ _ L _
      
      typedCharacters.insert("O")
      print(hangman(search: search, typedCharacters: typedCharacters)) // A _ _ L _
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-20
        • 2012-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多