我在Swift

时间:2019-07-17 18:32:57

标签: swift

我的iOS应用程序中有一段代码,应该仔细检查一个单词并检查其中是否包含字符。找到至少一个字符后,应将一个与单词长度相同的,全为“ _”的字符串更改为字符在正确位置的字符串:

wordToGuess = six
letterGuessed = i
wordAsUnderscores = _i_

该代码有效。但是,当我输入诸如“ć”,“ł”,“±”等字符时,我开始遇到问题。通过使用character.utf8.count,我发现Swift认为这些字符不是1个而是2个字符。所以我得到这样的东西:

wordToGuess = cześć
letterGuessed = ś
wordAsUnderscores = _ _ ś (place filled with empty char) _

它占据了2个地方。

我在这里待了6个小时,却不知道如何解决,所以我要向你们寻求帮助。

应该执行的代码:

let characterGuessed = Character(letterGuessed)

for index in wordToGuess.indices {
    if (wordToGuess[index] == characterGuessed) {
        let endIndex = wordToGuess.index(after: index)
        let charRange = index..<endIndex

        wordAsUnderscores = wordAsUnderscores.replacingCharacters(in: charRange, with: letterGuessed)
        wordToGuessLabel.text = wordAsUnderscores
    }
}

我希望代码将“ć”,“ł”,“±”字符与“ i”,“ a”等相同。我不希望他们被视为2。

1 个答案:

答案 0 :(得分:2)

原因是您不能使用一个字符串(wordToGuess)的索引下标另一个字符串(wordAsUnderscores)。通常,一个集合的索引不得与其他集合一起使用。 (尽管有类似Array的异常)。

这是一个有效的变体:

let wordToGuess = "cześć"
let letterGuessed: Character = "ś"

var wordAsUnderscores = "c____"

wordAsUnderscores = String(zip(wordToGuess, wordAsUnderscores)
    .map { $0 == letterGuessed ? letterGuessed : $1 })

print(wordAsUnderscores) // c__ś_

并行遍历字符串,对于wordToGuess中的每个正确猜测的字符,wordAsUnderscores中的相应字符将替换为该字符。