如何比较 Swift 中的字符?我有带文本的 UILabel 和 UITextField

How can I compare characters in Swift? I have UILabel with text and UITextField

所以我有一个带有文本的 UILabel,我必须将其写入 UITextField 以检查 UILabel 和 UITextField 的字符是否相似? 所以我在 C-Lang 和 C-lang 中有一些实践来解决这个问题,我们必须编写整数索引来比较“UITextField”中“UILabel”中的索引。 所以我们有一个字符,如果标签和文本字段中的字符相同,我们只需增加一个索引并必须比较下一个索引(字符)。

我需要比较每个字符。例如,我们有一个字符串“Hello!”。如果我们写“Heklo?”,我们的字符“H”、“e”、“l”、“o”必须是绿色的,而我们的“k”和“?”必须是红色的。

在 swift 中,我尝试了同样的操作,但没有成功。

import UIKit

class ViewController: UIViewController {    
    private let textLabel: UILabel = {
        let label = UILabel()
        label.numberOfLines = 0
        label.lineBreakMode = .byWordWrapping
        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = "There are a text, which you must text to get the last character of this label!"
        label.sizeToFit()
        return label
    }()
    private let resultTextLabel: UILabel = {
        let label = UILabel()
        label.numberOfLines = 0
        label.lineBreakMode = .byWordWrapping
        label.translatesAutoresizingMaskIntoConstraints = false
        label.sizeToFit()
        return label
    }()
    private let textField : UITextField = {
        let text = UITextField(frame: CGRect(x: 20, y: 300, width: 300, height: 40))
        text.placeholder = "Enter text Here!"
        text.font = .systemFont(ofSize: 15)
        text.autocorrectionType = .no
        text.keyboardType = .default
        text.returnKeyType = .done
        text.clearButtonMode = .whileEditing
        text.addTarget(self, action: #selector(checkWrongOrRight), for: .editingChanged)
        return text
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(textLabel)
        view.addSubview(textField)
        view.addSubview(resultTextLabel)
        setUpConstraints()
    }
    @objc func checkWrongOrRight(_ textField: UITextField) {
        // ??????????????? I thought that a logic of app could be here        
        if textLabel.text == resultTextLabel.text {
            textLabel.textColor = .green
        } else {
            textLabel.textColor = .red
        }
    }
    func setUpConstraints() {   
        textLabel.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 20).isActive = true
        textLabel.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: -20).isActive = true
        textLabel.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 100).isActive = true
        resultTextLabel.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 20).isActive = true
        resultTextLabel.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: -20).isActive = true
        resultTextLabel.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 500).isActive = true        
    }
}

那么如何比较 UILabel 和 UITextField 中的字符?

为什么要比较 textLabel.text 和 resultTextLabel.text? 改成这样。

@objc func checkWrongOrRight(_ textField: UITextField) {
        if textLabel.text == textField.text {
            textLabel.textColor = .green
        } else {
            textLabel.textColor = .red
        }
    }

我不确定 resultTextLabel 在代码中的作用是什么。

实现此目的的一种方法是获取键入文本的长度并将其与相同长度的预期文本的子字符串进行比较:

@objc func checkWrongOrRight(_ textField: UITextField) {
        guard let text = textLabel.text,
              let input = textField.text
        else {
            textLabel.textColor = .red
            return
        }

        if  input == text.prefix(input.count) {
            textLabel.textColor = .green
        } else {
            textLabel.textColor = .red
        }
    }

编辑

由于实际问题是根据是否匹配为单个字符着色:

您可以为此使用属性字符串,获取不正确的字符范围并将红色作为属性应用于这些范围:

在你的视图控制器中定义这个辅助函数

// helper function that returns an attributed string to display
func displayString(input: String?, expected: String?) -> NSAttributedString {
        guard let input = input,
              let expected = expected
        else {
            return NSAttributedString(string: "")
        }
        // Get an array of NSRange objects of incorrect characters
        let errorRanges = zip((0...), zip(input, expected).map(==)).filter { ! }.map { NSRange(location: [=11=].0, length: 1) }

        // Set the default colour
        let attString = NSMutableAttributedString(string: input, attributes: [.foregroundColor: UIColor.green])
        // Set the colour for incorrect characters to red
        errorRanges.forEach { range in
            attString.addAttribute(.foregroundColor, value: UIColor.red, range: range)
        }

        return attString
    }

您可以将其用作

@objc func checkWrongOrRight(_ textField: UITextField) {
        textField.attributedText = displayString(input: textField.text, expected: textLabel.text)
    }

这会为不正确的字符着色。

可以进行优化 - 例如将当前的 1 个字符长度范围转换为连续字符不正确的单个范围。