Задание 2 cs193p Winter 2017 «Умный» Калькулятор. Решение. Обязательные и дополнительные пункты.

Содержание

Текст Домашнего задания на английском языке доступен на  iTunes в пункте “Programming: Project 2: Calculator Brain″На русском языке вы можете скачать  текст Задания 2 здесь:

Задание 2 iOS 10.pdf

В Задании 2 вы усовершенствуете возможности Калькулятора, позволяя ему вводить “переменные” и поддерживать операцию Undo. Вы также подготовите Калькулятор к Заданию 3 следующей недели.
Для успешного выполнения Задания 2 нужно изучить материлы Лекций 1, 2 и 3.

Несмотря на схожесть названия Задания 2 в курсе «Developing  iOS 10 Apps with Swift» на название Задание 2 в предыдущем курсе  «Developing iOS 9 Apps with Swift», вам предлагается реализовать его совершенно по-другому, ближе к функциональному стилю программирование, а не объектно-ориентированному как было в прошлый раз. И начало этому положено в Задании 1 и на Лекциях 1 и 2, когда Модель CalculatorBrain, которая в прошлом курсе была  классом class, была заменена на структуру struct

В этом Задании вам придется кардинально поменять Модель вашего MVC и составить ее уже из двух совершенно отдельных структур данных: struct CalculatorBrain и Dictionary<String : Double> variableValues . Это абсолютно законно. Нет правила, которое бы говорило, что ваша Модель должна иметь единственную структуру данных.
Некоторые подсказки вы найдете в Лекции 3.

От вас потребуется знание всего спектра приемов работы со структурами struct, перечислениями enum, семантическое понимание Optional, использование замыканий и т.д.

Мое решение Задания 2 Зима 2017 г. Находится на Github:

Код для обязательных пунктов находится на Github.
Код для обязательных и дополнительных пунктов находится на Github.

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

Не изменяйте, не убирайте и не добавляйте ничего в public API (то есть НЕprivate func и vars) из вашего CalculatorBrainв Задании 1, за исключение undo ()и того, что определено в Обязательных пунктах 3 и 4. Продолжайте использовать Dictionary<String,Operation> в качестве основной внутренней структуры данных для выполнения операций в CalculatorBrain.

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

Ваш пользовательский интерфейс (UI) должен быть всегда синхронизирован с вашей Моделью (CalculatorBrain).

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

Наделите ваш CalculatorBrain способностью вводить “переменные”. Сделайте это путем реализации следующего API в вашем CalculatorBrain

func setOperand  (variable named: String)

Эта  функция должна делать в точности то, что вы можете себе представить: вводить “переменную” как операнд (например, setOperand (variable: “x”) будет вводить переменную с именем х). Установка операнда в x, а затем выполнение операции cos будет означать cos (x) в вашем CalculatorBrain.

Читать далее

Задание 1 cs193p Winter 2017 Калькулятор.Решение. Обязательные и дополнительные пункты.

Содержание

Текст Домашнего задания на английском языке доступен на  iTunes в пункте “Programming: Project 1: Calculator″На русском языке вы можете скачать  текст Задания 1 здесь:

Задание 1 iOS 10.pdf

Начинаем выполнять Задание 1 с кода, полученного в конце Лекции 2. Профессор настоятельно рекомендует не копировать код первых 2-х Лекций, а непосредственно печатать его в Xcode, так как это даст хороший опыт освоения среды разработки Xcode 8.

Я все-таки привела на Github коды демонстрационного примера, соответствующие окончанию Лекций 1 и 2. Это позволит совсем начинающим не «застрять» на самом первом этапе.

Решение Задания 1 находится на Github:

без кортежа в Моделе CalculatorBrain —  на Github
c кортежем в Моделе CalculatorBrain —  на Github

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

Ваш Калькулятор (Сalculator) уже умеет работать с числами с плавающей точкой (например, если вы последовательно будете нажимать на клавиши 3 ÷ 4 =,  то он покажет правильный результат  0.75), тем не менее, пока нет возможности ввести число с плавающей точкой. Это надо исправить. Разрешите вводить только правильные числа с плавающей точкой (например,  “192.168.0.1”  — неправильное число с плавающей точкой). Вам нужно добавить новую кнопку с точкой “.”. В обязательных пунктах этого Задания не беспокойтесь о точности и значащих цифрах (выполнение этой работы относится к дополнительным пунктам этого Задания).

Прежде всего надо сделать небольшое замечание относительно точки «.» как десятичного разделителя.

Замечание. Если вы будете использовать символ  точки «.» в качестве десятичного разделителя в Задании 1, то оно может работать на симуляторе и может не работать на вашем реальном устройстве, если Регион на вашем приборе установлен так, что там не применяется «.» для десятичных чисел. В этом случае приложение закончится аварийно. Мы будем проектировать приложение, которое должно работать на симуляторе. В конце выполнения всех пунктов (обязательных и дополнительных) Задания 1 в примечании я расскажу, что нужно делать, чтобы не зависеть от Региона.

Но вернемся к нашему пункту Задания и попытаемся заблокировать повторный ввод десятичного разделителя, который дальше по тексту мы будем условно называть «точкой», хотя, как мы уже знаем, это — не всегда точка.

Читать далее

Лекция 5 CS193P Winter 2017 — Жесты и множественные MVCs.

Лекция 5 охватывает множество важных тем:

  •  взаимодействие Модели и Controller с целью изменения View,
  •  жесты, которые являются “входом” для нашего приложения, 
  •  множественные MVC и как построить большие приложения, которые состоят из комбинаций различных MVCs,
  •  segues и подготовка MVC с помощью метода prepare (forSegue:)

В начале Лекции 5  обсуждается Модель для приложения FaceIt, которая позволяет задавать «выражение лица». В Controller в виде переменных vars создаются две «зеленые стрелки«:  одна — к Модели, другая — к View . Помните их на картинках, посвященных MVC? Для удержания Модели и View в синхронном состоянии для обеих переменных  vars используется очень крутая возможность Swift — Наблюдатели Свойств (Property Observers), одним из которых является didSet {}. Но, оказывается,  didSet {} срабатывает не всегда. Как «разрулить» эту ситуацию и рассказывает Пол Хэгерти в начале Лекции 5.  Чрезвычайно полезная вещь.

Читать далее

Лекция 4 CS193P Winter 2017 — Views.

Лекция 4  полностью посвящена ViewsViews — это прямоугольные области на экране, в которых мы рисуем и получаем от пользователя так называемые “жесты прикосновения” (touch gestures), как одинарные, так и множественные. Но на Лекции 4 ведется разговор только о рисовании, управление жестами перенесено в Лекцию 5. Никогда раньше в своих курсах Пол Хэгарти не уделял столько внимания рисованию Views. Возможно, это связано с тем, что компактность кода и богатство синтаксических конструкций Swift позволяют представить рисование как увлекательный и очень интеллектуальный процесс.

Читать далее

Лекция 3 CS193P Winter 2017 — Больше Swift и Фреймворк Foundation.

Хотя название Лекции 3 этого курса  «Developing  iOS 10 Apps with Swift» совпадает с названием Лекции 3 курса «Developing iOS 9 Apps with Swift» на этой Лекции очень отчетливо видно, что профессор Пол Хэгерти сделал небольшой разворот всего курса от ОБЪЕКТНО-ОРИЕНТИРОВАННОГО программирования, которое напоминает “Дикий Запад” с объектами, на которые указывает множество людей, к ФУНКЦИОНАЛЬНОМУ программированию с множеством неизменяемых объектов с APIs похожими на математические функции.

Конечно, iOS вовсе не была сконструирована на основе идеи функционального программирования. Но люди, которые изобретали Swift, держали “в голове” идею о функциональном программировании. Так что при разработке вашего iOS приложения (по крайней мере в части Модели) вы можете использовать множество элементов функционального программирования.

Это новый рубеж в iOS программировании, потому что в течение 20 -30 лет люди в основном использовали в iOS программировании только reference type объекты, имея в виду концепцию объектно-ориентированного программирования. Но когда вы программируете с помощью структур structs и перечислений enums, и особенно если вы подключаете механизмы протоколов Protocols (рассматриваются позже) и Generics, то вы можете реально сделать прекрасную работу, имеющую дело с реальным функциональным программированием.

И хотя темы в Лекции 3 нового курса примерно те же, акценты расставлены совсем по-другому. Теперь на первом месте value types, а о reference types — лишь мимоходом, подробно о структурах structs и перечислениях enums,  а о классах classes — лишь мимолетом. Очень подробно о диапазонах Range<T> и о том, при каких условиях Range<T> становится последовательностью Sequence и позволяет применять к себе синтаксическую конструкцию for in. Кстати, единственный оставшийся в Swift оператор for.

Читать далее