NSInteger 0+0=4300282608

Я разрабатываю простое приложение-калькулятор, чтобы понять, как работает разработка OSX (это не домашнее задание). Когда addAction(_ sender: NSButton) запускается, он добавляет currentCount и amountToAdd вместе, затем обновляет currentCount и устанавливает его в currentCountLabel.

Проблема: при первом запуске приложения currentCount и amountToAdd установлены на 0, но при суммировании получается 4 300 282 608. Если я нажму кнопку очистки перед добавлением, она будет равна 0, что правильно.

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

import Cocoa

class ContainerViewController: NSViewController {

    var currentCount: Int = 0
    var amountToAdd: Int = 0

    @IBOutlet weak var currentCountLabel: NSTextField!
    @IBOutlet weak var amountToAddTextField: NSTextField!


    override func viewDidLoad() {
        super.viewDidLoad()
        currentCountLabel.integerValue = 0
        amountToAddTextField.integerValue = 0
    }

    @IBAction func amountTextField(_ sender: NSTextField) {
        amountToAdd = amountToAddTextField.integerValue
    }

    @IBAction func addAction(_ sender: NSButton) {
        currentCount = currentCount + amountToAdd
        currentCountLabel.integerValue = currentCount
    }

    @IBAction func clearAction(_ sender: Any) {
        currentCount = 0
        amountToAdd = 0
        currentCountLabel.integerValue = 0
        amountToAddTextField.integerValue = 0
    }

    func getEntryLog() -> String {
        return "\(currentCount) + \(amountToAdd) = \(currentCount + amountToAdd)"
    }
}

NSInteger 0+0=4300282608

При загрузке изображения текущий счет становится случайным числом при каждом запуске...

Я не могу воспроизвести ту же проблему, используя точно такой же код, как у вас. Вы сделали какие-то специальные настройки для вашей раскадровки? Пожалуйста, попробуйте создать новый проект и посмотрите, сможете ли вы воспроизвести проблему.

OOPer 10.04.2019 18:38
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
37
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предлагаю вам добавить точку останова в addAction и подтвердить, какое из этих двух значений неверно. На основании того, чем вы с нами поделились, предположительно currentCount не то, что вы думаете.

Единственное незначительное логическое расхождение, которое я вижу здесь, заключается в том, что в viewDidLoad вы предполагаете, что amountToAdd и currentCount оба являются 0, хотя технически возможно, что тот, кто представил этот контроллер представления, мог сбросить одно из этих значений (возможно, неправильно) между моментом, когда контроллер представления был создан и когда он был загружен.

Чтобы устранить это логическое отключение, вы можете явно использовать эти переменные, а не 0:

override func viewDidLoad() {
    super.viewDidLoad()
    currentCountLabel.integerValue = currentCount
    amountToAddTextField.integerValue = amountToAdd
}

Или, если вы хотите, чтобы загрузка контроллера представления сбрасывала представление, тогда и viewDidLoad, и clearAction вызывают некоторую общую процедуру:

override func viewDidLoad() {
    super.viewDidLoad()
    resetValues()
}

@IBAction func clearAction(_ sender: Any) {
    resetValues()
}

private func resetValues() {
    currentCount = 0
    amountToAdd = 0

    currentCountLabel.integerValue = 0
    amountToAddTextField.integerValue = 0
}

Если у вас есть какой-то другой код, представляющий этот контроллер представления, я бы посоветовал вам проверить его на наличие всего, что могло установить (возможно, неправильно) currentCount.

Или поставьте точку останова в viewDidLoad и добавьте часы на значение, которое, по вашему мнению, не должно быть. Например. Я control-щелкнул currentCount в представлении переменных и выбрал «Смотреть currentCount», и теперь он будет останавливаться каждый раз, когда это значение изменяется.

Приносим извинения за то, что не ответили раньше. Я преследовал проблему с помощью отладчика, и оказалось, что после инициализации @IBOutlet weak var amountToAddTextField: NSTextField!amountToAdd изменяется. Он перешел к тому, что казалось машинным кодом, но я не смог увидеть изменение значения за это время. Очень странное поведение... Если я позвоню reset(), он будет работать, как и ожидалось. Спасибо за помощь!

Stephen Collins 11.04.2019 17:26

Другие вопросы по теме