二元运算符“==”不能应用于 'UILabel?' 和 'String' 类型的操作数

Binary operator '==' cannot be applied to operands of type 'UILabel?' and 'String'

错误:二元运算符“==”不能应用于 'UILabel?' 和 'String'

类型的操作数

import UIKit

class ViewController: UIViewController {
  let Soft = 5
  let Medium = 8
    let Hard = 12


    @IBAction func hardnessSelected(_ sender: UIButton) {
        let hardness = sender.titleLabel

        if hardness == "Soft"{
            print(Soft)
        }
        else if hardness == "Medium"{
            print (Medium)
        }
        else {
            print (Hard)
        }

    }


}

我该如何解决这个错误?

UIButton.titleLabel is a UILabel and it stores its text in UILabel.text 属性:

let hardness = sender.titleLabel.text

UIButton的情况下你也可以访问UIButton.currentTitle 属性:

let hardness = sender.currentTitle

您正在尝试比较两种不同的类型。要获取 UILabel 的实际文本,您需要 hardness.text.

UIButton 通过管理其文本绘图的 UILabel 公开其标签。从而改变:

let hardness = sender.titleLabel

let hardness = sender.titleLabel.text

UIKit 文档说:

UIButton

var titleLabel: UILabel?

A view that displays the value of the currentTitle property for a button.

和:

UILabel

var text: String?

The current text that is displayed by the label.

还有一个更直接的方法使用currentTitle:

UIButton

var currentTitle: String?

The current title that is displayed on the button.

因此:

let hardness = sender.currentTitle

也可以。

你没有给出错误所在的行号,但查看它提到操作 == 的文本,所以我猜它是其中之一:

if hardness == "Soft"{

else if hardness == "Medium"{

"Soft"和"Medium"是弦,所以硬度必须是'UILabel?。这些类型不能相互比较。您一定想在按钮上显示文本?查看 UILabel docs,有一个 text 属性,所以您可能想更改此行以获取表示按钮文本的字符串:

let hardness = sender.titleLabel.text

您使用的是动态按钮吗?将发件人与您正在检查的按钮进行比较会更不容易出错。将硬编码字符串与按钮文本进行比较可能会导致 运行 次错误。也许您没有正确区分大小写、拼写错误的文本,或者决定稍后进行本地化,因此不同语言的文本可能会有所不同。这些错误不会在编译时被捕获。