如何比较 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 iOS - 从多行 uitextview 获取带有换行符的文本,因为它们在屏幕上可见
如何从 Swift 中的 UITextView 获取链接范围