Двоичный оператор '==' нельзя применять к операндам типа 'UILabel?' и "Строка" - PullRequest
0 голосов
/ 13 января 2020

Ошибка: двоичный оператор '==' не может быть применен к операндам типа '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)
        }

    }


}

Как я могу исправить эту ошибку?

Ответы [ 4 ]

1 голос
/ 13 января 2020

Вы не указываете номер строки, в которой включена ошибка, но, глядя на текст, в котором упоминается операция ==, поэтому я предполагаю, что это один из следующих вариантов:

if hardness == "Soft"{

else if hardness == "Medium"{

"Soft" и «Средние» - это струны, поэтому твердость должна составлять 'UILabel?. Эти типы нельзя сравнивать друг с другом. Вы хотите, чтобы текст отображался на кнопке? Глядя на UILabel docs , есть свойство text, поэтому вы, вероятно, захотите изменить эту строку, чтобы получить строку, представляющую текст кнопки:

let hardness = sender.titleLabel.text

Используете ли вы Dynami c кнопки? Было бы менее подвержено ошибкам просто сравнить отправителя с кнопкой, которую вы проверяете. Сравнение жестко закодированных строк с текстом кнопки может привести к ошибкам во время выполнения. Возможно, вы не правильно поняли дело, неправильно написали текст или решили локализовать позже, чтобы текст мог быть другим на другом языке. Эти ошибки не будут обнаружены во время компиляции.

1 голос
/ 13 января 2020

Вы пытаетесь сравнить два разных типа. Чтобы получить фактический текст UILabel, вам понадобится hardness.text.

1 голос
/ 13 января 2020

UIButton выставляет свою метку через UILabel, которая управляет рисованием его текста. Таким образом, измените:

let hardness = sender.titleLabel

на

let hardness = sender.titleLabel.text

UIKit документы говорят:

UIButton

var titleLabel: UILabel?

Представление, отображающее значение свойства currentTitle для кнопки.

и:

UILabel

var text: String?

Текущий текст, отображаемый надписью.

Существует также более прямой способ, используя currentTitle:

UIButton

var currentTitle: String?

Текущий заголовок, который является на кнопке отображается

Таким образом:

let hardness = sender.currentTitle

также будет работать.

1 голос
/ 13 января 2020

UIButton.titleLabel является UILabel и сохраняет его текст в UILabel.text свойстве:

let hardness = sender.titleLabel.text

В случае UIButton Вы также можете получить доступ к UIButton.currentTitle свойству:

let hardness = sender.currentTitle
...