Лекция 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.

Читать далее

Лекция 2 CS193P Winter 2017 — MVC; Демонстрация iOS 10, Xcode 8 и Swift 3.

На Лекции 2 профессор подробно с картинками объясняет использование паттерна MVC для разработки iOS приложений.

Затем следует продолжение демонстрационного приложения Калькулятор, начатого на прошлой лекции. Происходит разделение кода Модели и кода, обслуживающего View Controller. Появляется новая структура struct CalculatorBrain, которая представляет лагерь Модель. Возможно вы привыкли использовать структуры struct в других языках и думаете о них, как о маленькой коллекции других переменных. В Swift структура struct — это “гражданин” первого класса, очень похожий на класс class. У класса class и структуры  struct много отличий, но самых главных два:

  1. Классы classes имеют наследование (inheritance), а структуры structs — нет.
  2. Классы classes ”живут” в “куче”, и у вас есть на них указатели.  Классы classes используют стиль передачи по ссылке reference types. Структуры structs НЕ ”живут” в “куче” и передаются повсюду путем их копирования (точнее с использованием механизма copy-on-write). Мы называем этот стиль передачи value types.

Профессор показывает, как проектировать Модель с использованием структуры struct CalculatorBrain, отталкиваясь от  public API Модели,  как добиться расширяемой функциональности в структурах struct, ведь мы не можем использовать создание subclass, как в классе class. Показано создание вложенных структур  struct и перечислений enum. На очень коротких фрагментах кода объясняется, когда стоит применять Optional, а когда — нет, исходя из семантического содержания Optional. Очень подробно рассказывается о перечислениях enum и о том, что Optionals также являются enum. Оба имеют ассоциированные значения, но в случае с enum они  могут быть любыми, в том числе и замыканиями (closure).

Читать далее

Лекция 1 CS193P Winter 2017 — Введение в iOS 10, Xcode 8 и Swift 3. Часть 2.

Лекция 1 и слайды на английском языке находятся на  iTunes название “1. Introduction to iOS 10, Xcode 8, and Swift 3.”

На сайте представлен полный неавторизованный хронометрированный конспект Лекции 1 на русском языке.

Первая часть Лекции 1 CS193P Зима 2017 — 0 — 40 минута находится здесь,
Вторая часть Лекции 1 CS193P Зима 2017 — 40 — 85 минута — находится в этом посте.

Этот же конспект можно посмотреть в PDF файле:

Лекция 1 CS193P Winter 2017 iOS 10 (1).pdf


Код демонстрационного примера для Лекции 1 находится на Github в папке Calculator I.

———   ПРОДОЛЖЕНИЕ КОНСПЕКТА  ——————-

—————— 40-ая минута Лекции ——————
Вы впервые видите локальную переменную var digit в Swift. Ключевое слово var означает, что это локальная переменная. Ее имя — digit. Если вы хотите указать тип этой переменной, например, String, то вам нужно разместить после имени переменной тип : String точно также, как это сделано для аргумента sender.
Но в Swift мы обычно этого не делаем,

потому что Swift — строго типизированный язык программирования, другими словами, вы везде должны определять тип. Он хочет знать типы всего, чего угодно. Он может “выводить” (infer) тип прямо из контекста и очень часто это делает. Это своего рода компромисс. Если у нас действительно сильно типизированный язык программирования, то вы вынуждены указывать тип абсолютно везде. Но совершенно прекрасно, когда компилятор может определить для вас какой тип имеет тот или иной элемент. Поэтому мы перестаем указывать тип, если это возможно.
При определении аргумента sender функции touchDigit мы не можем этого сделать, потому что мы должны знать, что ожидается на входе этого метода. Но для локальных переменных мы практически всегда можем не указывать тип.
Итак у нас есть локальная переменная digit, и я хочу установить ее равной чему-то.
Чему она должна быть равна?
Я хочу, чтобы она была равна заголовку (title) кнопки sender, которая послала мне сообщение touchDigit. Я хочу спросить у кнопки sender, какой у нее заголовок.
Как вы можете послать сообщение другому объекту в Swift?
Вы просто печатаете объект, которому хотите послать сообщение и добавляете точку “. :
Читать далее

Лекция 1 CS193P Winter 2017 — Введение в iOS 10, Xcode 8 и Swift 3. Часть 1.


Добро пожаловать на курс Стэнфорда CS193P. Это курс “Разработка iOS 10 приложений на Swift 3” Winter  2017.

Лекция 1 и слайды на английском языке находятся на  iTunes название “1. Introduction to iOS 10, Xcode 8, and Swift 3.”

На сайте представлен полный неавторизованный хронометрированный конспект Лекции 1 на русском языке.

Первая часть — 0 — 40 минута находится в этом посте,
Вторая часть — 40 — 85 минута — находится здесь.

Этот же конспект можно посмотреть в PDF файле:

Лекция 1 CS193P Winter 2017 iOS 10 (1).pdf


Код демонстрационного примера для Лекции 1 находится на Github в папке Calculator I.

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

Темы демонстрационного примера:

  • Создание проекта Project в Xcode 8
  • Построение пользовательского интерфейса (UI)
  • iOS симулятор
  • print (вывод на консоль, используя \( ) нотацию)
  • Определение класса в Swift, включая определение переменных экземпляра класса и методов
  • Связывание свойств (переменных экземпляра класса) в Swift коде с элементами пользовательского интерфейса UI (Outlets)
  • Привязка элементов UI к методам в коде Swift (Actions)
  • Доступ к iOS документации из кода
  • Optionals (?, неявное развертывание путем декларирования со знаком !, явное развертывание с помощью ! и if let)
  • Вычисляемые свойства (computed property)

За этими сухими пунктами скрывается блестящее изложение основных синтаксических конструкций Swift, начиная от самых элементарных и заканчивая такими сложными и непривычными как Optional и неявно развернутое Optional (implicitly unwrapped  Optional). Очень небольшое количество языков программирования имеет концепцию Optional. Это действительно крутая концепция, которую обязательно нужно понять, ибо в Swift она встречается повсюду, ей пронизаны всех iOS APIs. Но требуется некоторое время, чтобы к ней привыкнуть и эффективно ее использовать.

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

Поэтому для начинающих изучать Swift (а не программирование как таковое) Лекции 1 и 2 являются must have. В Лекции 2 продолжится демонстрационный пример, начатый на этой Лекции.

Читать далее

Стэнфордский курс «Developing iOS 10 Apps with Swift» теперь доступен на iTunes.

Стэнфордский курс  «Developing  iOS 10 Apps with Swift» теперь доступен на iTunes. Это долгожданное обновление предыдущего курса по  «Developing iOS 9 Apps with Swift» для версии Swift 3. Выложены пока 3 лекции и первое Задание на программирование.

Русскоязычный вариант неавторизованного конспекта этого курса будет появляться по мере готовности на этом сайте.

ОБСУЖДЕНИЕ МАТЕРИАЛОВ курса «Разработка iOS приложений с Swift» проводится на private новом форуме на Piazza. Вопросы можно задавать там.
Для регистрации вам необходимо пройти по ссылке:

http://piazza.com/moscow_physical_engineering_institute_bestkora.com/spring2017/mf141
и набрать private  код mf141.
В качестве предварительных требований к этому курсу указаны стэнфордские курсы CS106A&B и CS107. В настоящий момент они выложены на сайте Инженерной Школы Стэнфорда в очень удобной форме.

Неофициально на Youtube выложены первые 3 лекции курса «Developing iOS 10 Apps with Swift».

Неофициально в Youtube выложены первые 3 Лекции курса «Developing iOS 10 Apps with Swift»:

Лекция 1. Overview of iOS.

Лекция 2. Model View Controller.

Лекция 3. More Swift & Foundation Framework.

 

Курс CS193p Winter 2017 «Developing iOS 10 Apps with Swift» на подходе.

Стэнфордский курс CS193p Зима 2017 «Developing iOS 10 Apps with Swift» уже появился на iTunes, но пока там только заголовок и описание. По-видимому, идет оформление, и первые лекции появятся в ближайшее время.
1 февраля ссылка на этот курс в iTunes исчезла. Я не знаю, что это означает — идет оформление материала, курс будет выложен позже или не будет выложен вообще (что уже было осенью 2015 года). Ждем развития событий.

Concurrency (многопоточность) в Swift 3 (GCD и Dispatch Queues).

Надо сказать, что многопоточность (сoncurrency) в iOS всегда входит в вопросы, задаваемые на интервью разработчикам iOS приложений, а также в число топ ошибок, которые делают программисты при разработке iOS приложений. Поэтому так важно владеть этим инструментом в совершенстве.

Итак, у вас есть приложение, оно работает на main thread (главном потоке), который отвечает за выполнение кода, отображающего ваш пользовательский интерфейс (UI). Как только вы начинаете добавлять к вашему приложению такие затратные куски кода, как загрузка данных из сети или обработка изображений на main thread (главном потоке), то работа вашего пользовательского интерфейса  начнет сильно замедляться и даже может привести к полному его «замораживанию». 

Как вы можете изменить архитектуру вашего приложения, чтобы таких проблем не возникало? В этом случае на помощь приходит сoncurrency или многопоточность , которая позволяет одновременно выполнять две или более независимые задачи (tasks): вычисления, загрузку данных из сети или с диска, обработку изображений и т.д.

Процессор в каждый заданный момент времени может выполнять один из ваших потоков (threads).
В случае одноядерного процессора, сoncurrency или многопоточность достигается многократными кратковременными переключениями между «потоками» (threads), на которых выполняются задачи (tasks), создавая достоверное представление об одновременном выполнении задач на одноядерном процессоре.  На многоядерном процессоре многопоточность достигается тем, что каждому «потоку», связанному с задачей, предоставляется свое собственное ядро для запуска. Обе эти технологии используют общее понятие многопоточности (сoncurrency).

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

В iOS программировании многопоточность  предоставляется разработчикам в виде нескольких инструментов:  Thread Grand Central Dispatch (сокращенно  GCD) и Operation — и используется с целью увеличения производительности и отзывчивости пользовательского интерфейса. Мы не будем рассматривать Thread, так как это низкоуровневый механизм, а сосредоточимся на GCD и Operation (объектно-ориентированном API, построенном поверх GCD).

Читать далее