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

Posted

技术标签:

【中文标题】如何比较 Swift 中的字符?我有带有文本和 UITextField 的 UILabel【英文标题】:How can I compare characters in Swift? I have UILabel with text and UITextField 【发布时间】:2021-07-27 00:08:03 【问题描述】:

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

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

我很快尝试做同样的事情,但它不起作用。

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 中的字符呢?

【问题讨论】:

添加UITextViewDelegate ? 【参考方案1】:

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

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

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

【讨论】:

嗨!谢谢您的回答!但是有我们比较全文。但我需要比较每个角色。例如,我们有一个字符串“Hello!”。如果我们写“Heklo?”,我们的字符“H”、“e”、“l”、“o”必须是绿色的,而我们的“k”和“?”必须是红色的。 要比较相同的索引吗? @AliCoder 是的。 Abizern已经做到了,感谢您的关注! @海莉【参考方案2】:

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

@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  !$1 .map  NSRange(location: $0.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 个字符长度范围转换为连续字符不正确的单个范围。

【讨论】:

有一个专门用于此目的的方法,称为hasPrefix。一个班轮textLabel.textColor = text.hasPrefix(input) ? .green : .red 大家好。我在这里复制了@Hailey 的答案。你好!谢谢您的回答!但是有我们比较全文。但我需要比较每个角色。例如,我们有一个字符串“Hello!”。如果我们写“Heklo?”,我们的字符“H”、“e”、“l”、“o”必须是绿色,而我们的“k”和“?”必须是红色的 @AliCoder 如果你把它放在你的问题中会有所帮助。 干得好!真的行!谢谢! @Abizern

以上是关于如何比较 Swift 中的字符?我有带有文本和 UITextField 的 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

比较 Swift 中的字符串对象

SWIFT iOS - 从多行 uitextview 获取带有换行符的文本,因为它们在屏幕上可见

Swift - 文本字段中的字符不可见

如何从 Swift 中的 UITextView 获取链接范围

如何在 swift 4 中的另一个表视图控制器中获取该表视图单元格中的文本字段文本?

PowerShell - 查找和修改字符串中的多个文本