我的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。
答案 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
中的相应字符将替换为该字符。