首页 > 解决方案 > 无法从包含多个扩展字素簇的字符串中形成字符

问题描述

在构建刽子手应用程序时,我尝试制作一种可以接受单击字母的方法,将其放入一个 tappedLetter 数组中,然后检查它是否包含在要查找的单词中,以及该字母是否应该放在我们当前尝试的单词中的位置制作。

用户要查找的单词显示为“?” 而不是它的字母,所以当用户点击右字母对应的“?” 替换为那个字母

当我单击字母应用程序崩溃时出现问题。方法有问题,我不知道我是否以正确的方式解决这个问题,只使用一种方法来替换“?” 单击时带有字母

class ViewController: UIViewController {
    var points : UILabel!
    var letterButton = [UIButton]()
    var currentWord : UITextField!
    var wrong : UILabel!
    var score = 0
    var mistake = 0
    var activatedButton = [UIButton]()
  
    var word = ""
    var usedLetter = ""
    var promptWord = ""
    var tappedLetter = [Character]()

我将跳过我制作 NSLayoutConstraint 和 addSubview 的部分

    @objc func touchedButton(_ sender:UIButton){
        guard let letter = sender.titleLabel?.text else {return}
        
        tappedLetter.append(contentsOf: letter.lowercased())
        print("U clicked on: \(tappedLetter)")
        activatedButton.append(sender)
        sender.isHidden = true
        sender.isUserInteractionEnabled = false
    
        
        if tappedLetter.contains(Character(usedLetter)){ //Error:Thread 1: Fatal error: Can't form a Character from a String containing more than one extended grapheme cluster
            let char = Character(usedLetter)
            for letter in word{
                if letter == char{
                    if let position = word.firstIndex(of: letter){
                        promptWord.remove(at: position)
                        promptWord.insert(letter, at: position)
                    }
                }
            }
                }
    }
    
    func loadlevel(){
      
        if let startWordUrl = Bundle.main.url(forResource: "start", withExtension: "txt"){
            if let startWord = try? String(contentsOf: startWordUrl){
                var allWords = startWord.components(separatedBy: "\n")
                word = allWords.randomElement()!
             
                for letter in word {
                    usedLetter.append(Character(extendedGraphemeClusterLiteral: letter))
                    promptWord.append("?")
                }
           
                currentWord.text = promptWord
            }
            
        }
        
        
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        loadlevel()
    }

标签: swift

解决方案


您正在尝试将字符串转换为单个字符。我认为您要检查的是字符串 usedLetters 包含按钮中的字符。尝试这个

if usedLetter.contains(Character(letter)) {

代替

if tappedLetter.contains(Character(usedLetter)){

同样的事情

let char = Character(/* usedLetter is a full string of characters */)


let char = Character(letter)

推荐阅读