Задание 2. Решение — продолжение (обязательные пункты 9-12) Swift 1.2 и Swift 2.0

Текст Домашнего задания на английском языке доступен на  iTunes в пункте “Developing iOS 8 app: Programming: Project 2″.  Текст Домашнего задания на русском  языке доступен на

Задание 2 iOS 8_new.pdf

Результаты выполнения задания можно обсуждать на форуме Swift[ru] . Ваше решение может быть лучше и интереснее. Выкладывайте его в Github, давайте ссылку на Dropbox или используйте другие системы управления версиями. Xcode  работает напрямую с Github.

Пункт 9 обязательный

Добавьте две новых кнопки на цифровую клавиатуру вашего калькулятора  Calculator:→M и M. Эти две кнопки устанавливают и получают соответственно переменную в CalculatorBrain, называемую M.

  • →M  устанавливает значение переменной M в CalculatorBrain в текущее значение на дисплее.
  • →M не должна автоматичски выполнять↵ (хотя она должна переустановить  “пользователь в середине печати числа”)
  • Касание M должно помещать (push) переменную M в стэк (не значение M) в CalculatorBrain
  • Касание любой другой кнопки должно показывать оценку  CalculatorBrain (то есть результат evaluate()) на дисплее.
  • →M и M являются механизмом Controller, а не механизмом Model (хотя они оба используют механизм “переменных” Model).
  • Это не выдающаяся кнопка “memory” на нашем калькуляторе, но она является хорошим инструментом для тестирования правильно ли работает наша переменная функция, реализованная выше.

Примеры …

7 M + √ ⇒ description имеет вид (7+M)display — пустой, та как M не установлена

9 →M  display показывает 4 (квадратный корень 16), description все еще показывает (7+M)

14 + ⇒ display показывает 18description теперь (7+M)+14

Делаем словарь variableValues с переменными private, а в API калькулятора добавляем non-private методы setVariablegetVariable и clearVariable

Screen Shot 2015-03-28 at 8.39.51 AM

Располагаем на storyboard  кнопки →M  и M и с помощью CTRL-перетягивания создаем для них @IBAction функции setVariable и pushVariable

Screen Shot 2015-03-28 at 9.09.12 AM

Screen Shot 2015-03-28 at 9.04.58 AM
Screen Shot 2015-03-28 at 9.13.23 AMПроверяем работоспособность на примерах, представленных в задании.

Код можно посмотреть на Github.

Пункты 10 и 11 обязательные

Убедитесь, что кнопка  С  вашего Задания 1 работает правильно в этом задании.

Когда вы касаетесь кнопки С, переменная M должна быть убрана из variableValues Dictionary в CalculatorBrain ( не установлена в 0 или какое-то другое значение). Это позволит вам тестировать случай “неустановленной” переменной (потому что это заставит evaluate () вернуть nil, и таким образом,  дисплей  вашего калькулятора будет пустым, если M будет использоваться без →M).

Для придания гибкости API калькулятору — как нам советовали в подсказках — добавляем в CalculatorBrain еще два non-private метода clearStack и clearAll

Screen Shot 2015-03-28 at 9.50.14 AM
Используем одну из этих функций в реализации кнопки С

Screen Shot 2015-08-24 at 7.37.21 AM
Проверяем работоспособность на рекомендованной в подсказках последовательности ввода
C, M, → M, и т.д.

Пункт 12 обязательные

Ваш UI должен выглядеть хорошо на iPhone любого размера как в портретном, так и в ландшафтном режиме ( не беспокойтесь относительно iPad до следующей недели). Это означает, что вы должны сделать правильные установки Autolayout (Разметки) и больше ничего.

Выполнено. Код для Swift 1.2  и iOS 8.4 можно посмотреть на Github.

Код для Swift 2.0  и iOS 9 можно посмотреть на Github.

Задание 2. Решение — продолжение (обязательные пункты 9-12) Swift 1.2 и Swift 2.0: 6 комментариев

  1. Такой вопрос, когда мы делаем словарь variableValues с переменными private, сразу пропадает возможность его использовать в тестах, как можно тестить приватные свойства и методы? Просто на время убирать private или есть еще что-то?

      • @testable уже стоит)
        загрузил скриншот, может что-то дополнительно нужно настроить)

      • Как я понял в Swift private это private и поэтому в тестах приватные свойства и методы недоступны. И атрибут @testable помогает делая internal методы/свойства — public.

        • У вас есть
          internal func getVariable(symbol: String) -> Double?
          internal func setVariable(symbol: String, value: Double)
          internal func clearVariables()

          Используйте эти методы.

Обсуждение закрыто.