В swift для iO у меня есть блок кода if / else, реагирующий на изменения в UISwitch. Как вернуть выключатель в некоторых ситуациях?

Почему мы не можем представить 9.2 в двоичной с плавающей запятой?

Числа с плавающей запятой (немного упрощают) систему позиционной нумерации с ограниченным числом цифр и подвижным основанием point.

Дробь может быть выражена точно с использованием конечного числа цифр в системе позиционной нумерации, если простые множители знаменателя (когда доля выражена в младших ее членах) являются факторами базы .

Основными факторами 10 являются 5 и 2, поэтому в базе 10 мы можем представить любую долю вида a / (2b5c).

С другой стороны, единственным простым множителем 2 является 2, поэтому в базе 2 мы можем представлять только фракции вида a / (2b)

Почему компьютеры использовать это представление?

Поскольку это простой формат для работы, и он достаточно точен для большинства целей. В основном та же самая причина, по которой ученые используют «научную нотацию» и округляют их результаты до разумного количества цифр на каждом этапе.

Конечно, можно определить формат фракции, например (32) разрядный числитель и 32-разрядный знаменатель. Он мог бы представлять числа, которые не могли бы выполнять с плавающей точкой двойной точности IEEE, но в равной степени было бы много чисел, которые могут быть представлены в плавающей точке с двойной точностью, которые не могут быть представлены в таком формате фракции фиксированного размера.

Однако большая проблема заключается в том, что такой формат является болью для выполнения вычислений. По двум причинам.

  1. Если вы хотите иметь ровно одно представление каждого номера, то после каждого расчета вам нужно уменьшить долю до ее самых низких значений. Это означает, что для каждой операции вам в основном нужно выполнить наибольший общий расчет дивизора.
  2. Если после вашего расчета вы получите непредсказуемый результат, потому что числитель или знаменатель вам нужно найти ближайший представимый результат.

Некоторые языки предлагают типы фракций, но обычно они делают это в сочетании с высокой точностью, это позволяет не беспокоиться о приближении фракций, но создает собственную проблему, когда число проходит через большое количество шагов вычисления, размер знаменателя и, следовательно, хранилище, необходимое для фракции, может взорваться.

Некоторые языки также предлагают десятичные типы с плавающей запятой, которые в основном используются в сценариях, где важно, чтобы результаты, полученные компьютером, соответствовали ранее существовавшим правилам округления, которые были написаны с учетом людей (главным образом, финансовых расчетов). С ними немного сложнее работать, чем с двоичной плавающей точкой, но самая большая проблема заключается в том, что большинство компьютеров не предлагают аппаратную поддержку для них.

-1
задан Alfonso Tesauro 16 January 2019 в 16:32
поделиться

1 ответ

Вместо того, чтобы обращаться к UISwitch через ваш аргумент sender, вы переходите непосредственно к тому, что, как я полагаю, является значением IBOutlet. Вместо этого вы можете получить доступ к отправителю, как описано ниже:

@IBAction func userDidSelectVisibiltySwitch(_ sender: UISwitch) {
    if sender.isOn && badCondition {
        sender.setOn(false, animated: false)
    } else { // In this case it is normal, it does not execute the else {}
        // work to be done if the user has turned off the switch
    }
}

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

Я также пошел дальше и объединил ваше утверждение if, поскольку предоставленный вами образец не требует вложенной проверки.

ОБНОВЛЕНО НА ОСНОВЕ КОММЕНТАРИИ РМАДДИ

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

enter image description here

С этой настройкой я увидел следующее:

[ 1122]
  • Исходный код, отправленный OP, потерпит неудачу
  • Добавление DispatchQueue, как продемонстрировано OP, исправит переключение после небольшой задержки
  • Мое опубликованное решение будет работать правильно
  • [1122 ]

    Предполагая, что это то, что сделал OP, тогда первое исправление будет состоять в том, чтобы изменить событие на Value Changed. Тогда, как заявил rmaddy в комментарии, это будет успешным независимо от того, используете ли вы аргумент или IBOutlet. Исходя из первоначального вопроса, моя интерпретация заключалась в том, что возникла проблема с выходным значением и состоянием синхронизации в интерфейсе.

    0
    ответ дан CodeBender 16 January 2019 в 16:32
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: