Подтвердить что ты не робот

Двоичный оператор * не может применяться к операндам типа Int и Double

Я пытаюсь создать простое приложение Swift для расчета НДС (налоги на добавленную стоимость = 20%).

class ViewController: UIViewController {

@IBOutlet var resultTextView: UITextView!
@IBOutlet var inputTextField: UITextField!
@IBOutlet var calculateVATButton: UIButton!

override func viewDidLoad() {


    super.viewDidLoad()


    func taxesFree(number: Int)-> Double{


    var textfield = self.inputTextField.text.toInt()!
    let VAT = 0.2
    var result = textfield * VAT
     return result

              }

По какой-то причине я продолжаю получать

Двоичный оператор * не может применяться к операндам типа Int и Double

в строке результата

var result = textfield * VAT

внутри функции.

4b9b3361

Ответ 1

Вы должны преобразовать один тип в другой, так что обе переменные должны быть одного типа:

var result: Double = Double(textfield) * VAT

Ответ 2

Это потому, что вы пытаетесь умножить Int (текстовое поле) на Double (НДС). Поскольку при такой операции вы можете потерять точность двойного Swift, вы не сможете конвертировать одно в другое, поэтому вам нужно явно привести Int к Double...

var result = Double(textfield) * VAT

Ответ 3

Проблема здесь в том, что приведенное утверждение буквально истинно, потому что Свифт строго типизирован и не скрывает скрытого. Просто у меня был аналогичный случай с "двоичным оператором" - "не может применяться к операндам типа" Дата "и" Int ".

Если вы пишете:

var result = 10 * 0.2

... это прекрасно, но если вы пишете:

var number = 10
var result = number * 0.2

... это не нормально. Это связано с тем, что неизученные явные значения имеют соответствующий тип, выбранный компилятором, поэтому на самом деле первая строка считается var result = Double(10) * Double(0.2). В конце концов, как человек, вы можете иметь в виду, что 10 - это плавающая точка или целое число - вы обычно не говорите, что и ожидало бы, что это будет ясно из контекста. Это может быть немного больно, но идея сильных типов заключается в том, что после анализа кода он может иметь только одно допустимое скомпилированное выражение.

В общем случае вы создадите новое значение с помощью конструктора, поэтому var result = Double(textfield) * VAT в вашем случае. Это отличается от литья (textfield as Double), потому что Int не является подклассом Double; то, что вы делаете, вместо этого запрашивает создание полностью нового значения Double во время выполнения, теряя некоторую точность, если значение очень высокое или низкое. Это то, что свободно набранные языки подразумевают неявно с почти всеми непосредственными значениями при небольших, но значительных временных затратах.

В вашем конкретном случае было нецелесообразно иметь Int в первую очередь (даже если частичная часть не возможна), поэтому вам нужно было:

func taxesFree(number: Int) -> Double {
    var textfield = Double(self.inputTextField.text)!
    let VAT = 0.2
    var result = textfield * VAT
    return result
}

Ответ 4

В моем случае это просто кастинг CGFloat:

self.cnsMainFaqsViewHight.constant = CGFloat(self.mainFaqs.count) * 44.0

Ответ 5

Я неправильно понял оператора закрытого диапазона в Swift.

Вы не должны заключать диапазон в массив: [0...10]

for i in [0...10] {
    // error: binary operator '+' cannot be applied to operands of type 'CountableClosedRange<Int>' and 'Int'
    let i = i + 1
}

for i in 0...10 {
    // ok!
    let i = i + 1
}

Диапазон - это коллекция, которая сама может быть повторена. Не нужно оборачивать его в массив, как, возможно, было бы в Objective-C.

 0...3  ->  [0, 1, 2, 3]
[0...3] -> [[0, 1, 2, 3]]

Как только вы поймете, что ваш объект является вложенной коллекцией, а не массивом Ints, легко понять, почему вы не можете использовать числовые операторы для объекта.

Ответ 6

Вы можете конвертировать var result: Double = Double (текстовое поле)

Ответ 7

Это сработало для меня, когда я получил такое же сообщение об ошибке на игровой площадке:

func getMilk(howManyCartons: Int){
    print("Buy \(howManyCartons) cartons of milk")
    let priceToPay: Float = Float(howManyCartons) * 2.35
    print("Pay $\(priceToPay)")
}
getMilk(howManyCartons: 2)