Переходим на Swift 3 с помощью автомиграции в Xcode 8.2

Уже известно, что Xcode 8.2 будет последним релизом, который поддерживает переходную версию Swift 2.3. Сейчас действует версией Swift 3.0 и Apple анонсировала обновление Swift до версии 3.1 весной 2017 г., которое усовершенствует синтаксис языка, улучшит работу Swift Package Manager и Swift на Linux, а также обновит компилятор и стандартные библиотеки. Эта версия будет source совместима с Swift 3.0. То есть поставлена очень четкая цель : огромное количество кода, написанного на  Swift 3.0, будет восприниматься компилятором Swift 3.1 без изменения. Исключение составляют ошибки, которые будут отклонены компилятором, но в практике это будет встречаться очень редко.

Далее  команда Swift сосредоточится на Swift 4, который  обеспечит ABI стабильность для  Swift.

Поэтому самое время подумать сейчас о миграции своих приложений на Swift 3.

Я хочу поделиться некоторым опытом такой миграции на примере приложений. связанных со стэнфордским курсом «Developing iOS 9 Apps with Swift«, как демонстрационных (их 12), так и полученных в результате выполнения Заданий этого обучающего курса (их 6  с вариантами). Они все разной сложности, но там есть и рисование в drawRect, и многопоточность, и показ изображений с помощью ScrollView, и работа с сервером Twitter, и база данных Core Data, и работа с облачным сервисом Cloud Kit, и карты Map Kit. И все это было написано на Swift 2.2  (stanford.edu) и требовалось перевести на Swift 3. Код демонстрационных примеров стэнфордских курсов для Swift 2.3 находится на Github, а для Swift 3 — на Github.

Читать далее

Наш форум переезжает на Piazza

Уважаемые пользователи сайта bestkora.com.

Наш форум переезжает на Piazza! Обсуждение стэнфордских курсов CS193P по разработке iOS приложений на Swift (iOS 7, iOS 8, iOS 9 и будущего iOS10) мы будем проводить на  Piazza — том же инструменте, на котором профессор Пол Хэгерти проводит обсуждение со своими студентами. Чем быстрее вы начнете спрашивать на  Piazza вопросы по лекциям, демонстрационным примерам и заданиям стэнфордского курса CS193P, тем быстрее вы почувствуете преимущество накопленных здесь знаний ваших коллег и инструкторов. Вместо того, чтобы посылать email, вы можете послать свой вопрос на  Piazza и ваши коллеги и я постараемся ответить на него. Мы приветствуем любые ваши вопросы по тем направлениям разработки iOS приложений на Swift, над которыми вы работаете — даже если они заданы анонимно.
Я постараюсь постепенно перенести наиболее интересные вопросы с нашего старого форума на  Piazza.

Вы можете зарегистрироваться на новом форуме по ссылке, при этом надо указать private код курса mf141.

CS193P Stanford Spring 2016. Задание 6. Анимация. Решение. Ощутите «магию» Swift 3 на простейшей игре Breakout с Dynamic Animation.

screen-shot-2016-11-08-at-8-20-54-pm

Screen Shot 2015-09-11 at 10.50.23 AM

Текст Домашнего задания на английском языке доступен на iTunes «Developing iOS 9 Apps with Swift. Programming Project 6: Animation»Текст Задания 6 на русском  языке размещен в PDF — файле

Задание 6 iOS 9.pdf


Для выполнения Задания 6 необходимо освоить материал Лекции 14.
В качестве прототипа кода для Задания 6 можно использовать код приложения «Dropit L14«, полученный на Лекции 14, который доступен на сайте Stanford для Swift 2 и Xcode 7 ; для Xcode 8 и Swift 2.3  — на Github, для  Xcode 8 и Swift 3 — на Github, для Xcode 8Swift 3 и iOS 10 — на Github.
В этом посте подробно описывается выполнение обязательных и дополнительных пунктов Задания 6. В посте представлен код для  Xcode 8Swift 3 и iOS 10, который находится на Github в разделе Breakout_Assignment_6.

Да, будем выполнять Домашнее Задание 6 сразу для iOS 10 и Swift 3, потому что Задание 6 не связано с данными, получаемыми из сети, не связано с существенно усовершенствованными в iOS 10  фреймворками Core Data и UserNotifications. Приложение Задания 6 будет очень простым в архитектурном плане — там не будет ни SplitViewController, ни специальных seguesPopovers, Unwind Segues, Embedded Segues, Modal Segues. Оно будет представлять собой два слабо связанных между собой MVC, объединенных простейшим множественным MVCTabBarController. В Задании 6 нам предлагается продемонстрировать умение работать с системой Dynamic Animation, управляя динамическими элементами в виде UIViews. Кроме того, мы можем в таком простейшем приложении показать все возможные механизмы запуска кода — код в iOS приложениях не исполняется линейно, отдельные его фрагменты можно запустить с помощью:

  1.  жестов,
  2.  методов «жизненного цикла» UIViewController ( viewWillAppear, viewDidLoadviewDidLayoutSubviews и т.д.) и UIViewlayoutSubviews )
  3.  Наблюдателей Свойства didSet{ }, willSet{ },
  4.  lazy ( отложенной) инициализации,
  5.  инициализации в виде выполняемого замыкания ( с круглыми скобками «()» в конце),
  6.  делегирования, которое реализуется в Swift свойствами в виде замыканий,
  7. вычисляемых переменных с хранением в другом месте (другое свойство, NSUserDefaults, Core Data).

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

Читать далее

Невероятная «легкость бытия» с Core Data в iOS 10 и Swift 3.

Мы рассмотрим выполнение Задания 5 для курса «Developing iOS 9 Apps with Swift» на Swift 3 для iOS 10.
Почему это интересно?
Особенный интерес связан не столько со Swift 3, сколько с Core Data, который до выхода iOS 10 являлся одним из самых непонятных и сложных в использовании фреймворков, особенно в многопоточной среде.  На WWDC 2016 Apple представила в iOS 10 одну из самых значительных модернизаций Core Data со времен iOS 5.

Возможности новой Core Data в iOS 10

Во главе нового Core Data стоит класс NSPersistenceContainer, представляющий собой прекрасный полноценный Core Data Stack, который очень просто создать и использовать.  Класс NSPersistenceContainer снабжает вас очень простым  API:

screen-shot-2016-10-21-at-5-54-14-pm

Как это видно из названия, управление «видимыми» объектами Core Data осуществляется View Controllers на main queue с использованием viewContext. Очень легко работать с объектами Core Data в фоновом (background) режиме c помощью контекста, возвращаемого методом newbackgroundContext(). Но еще лучше, проще и оптимальнее выполнять различные операции с Core Data в фоновом (background) режиме с помощью метода performBackgroundTask(_:), который сам предоставляет разработчикам NSManagedObjectContext для выполнения этих операций:

screen-shot-2016-10-23-at-7-58-25-pm

Такой простой public API существенно снизит порог вхождения в Core Data.

Читать далее

Как заставить работать класс CoreDataTableViewController в Swift 3

screen-shot-2016-10-15-at-9-44-52-pm

Этот пост написан в продолжение поста «Как работать с курсом «Developing iOS 9 Apps with Swift»  в Xcode 8 с Swift 2.3  и Swift 3″.  Дело в том, что в Swift 3  запрос NSFetchRequest<NSFetchRequestResult> стал Generic, а следовательно, стал Generic и класс NSFetchResultsController<NSFetchRequestResult>. В результате возникли некоторые трудности при использовании в Swift 3 фантастически удобного класса CoreDataTableViewController, который разработан профессором Полом Хэгерти и предоставлен студентам Стэнфорда для удобной работы с данными Core Data в таблицах Table View. В этом посте я показываю, как эти трудности разрешить и заставить работать класс CoreDataTableViewController в Swift 3, и не только в iOS9, но и в iOS 10.

Вначале  очень кратко напомню  о том, откуда появился класс  CoreDataTableViewController. Когда у вас огромное количество информации в базе данных, то прекрасным средством показа этой информации является Table View. В 99% случаев либо Table View, либо Collection View используются для показа содержимого больших баз данных. И это настолько распространено, что Apple обеспечила нас в iOS прекрасным классом NSFetchedResultsController, который “подвязывает” запрос NSFetchRequest к таблице UITableView
И не только “подвязывает” лишь однажды, а эта “подвязка” действует постоянно и, если в базе данных каким-то образом происходят изменения, NSFetchRequest возвращает новые результаты и таблица обновляется. Так что база данных может меняться “за сценой”, но таблица UITableView всегда остается в синхронизированном с ней состоянии. Это действительно очень очень круто.
 NSFetchResultsController обеспечивает нас методами протоколов UITableViewDataSource и UITableViewDelegate, такими, как numberOfSectionsInTableView, numberOfRowsInSections и т.д. Единственный метод, который он не реализует, — это cellForRowAtIndexPath. Вам самим придется реализовать его, потому что для реализации метода cellForRowAtIndexPath нужно знать пользовательский UI для ячейки таблицы, а вы — единственный, кто знает, какие данные и как они размещаются на экране. Но что касается других методов протокола UITableViewDataSource, даже таких, как sectionHeaders и всего остального, NSFetchedResultsController берет все на себя.

Как работать с NSFetchResultsController?

Читать далее

Лекция 18 CS193P Spring 2016 — Persistence (постоянное хранение данных).

screen-shot-2016-10-13-at-1-17-46-pm
Хотя название Лекции 18 — Persistence (постоянное хранение данных), оказалось, что это как раз то, о чем профессор не успел сказать. Однако не стоит об этом сожалеть, потому что эту тему можно посмотреть  «Лекция 16:  Фотокамера, Постоянное Хранение и Вставка Картинки в картинку (Camera, Persistence and Embed Segues)» более  раннего курса  «Developing iOS 8 Apps with Swift»   стэнфордского университета  CS193P зима 2015 года.  .
 А Лекция 18 получилась фантастически полезной, так как  это  продолжение большого демонстрационного приложения Trax, в котором на примере работы с картой ( MapKit ) демонстрируются различного рода segues: модальный segue, Popover segue, Unwind segue как на iPad, так и на iPhone. Но это только основные направления, помимо которых в решение усложняющейся задачи вовлекаются все новые механизмы iOS программирования:

  • «радиостанции» в текстовых полях,
  • усовершенствование работы с клавиатурой
  • “переезд” (segueing) от MKMapView
  • создание на карте перемещаемых  и редактируемых «булавок» (pins)
  •  Autolayout c «нечеткими» границами и его использование для расчета предпочтительного размера MVC
  • управление поведением адаптивной презентации на приборах горизонтального Compact Size Class (iPhones)
  • визуальные эффекты (типа, Blur — “затуманивание”)

Читать далее

Как работать с курсом «Developing iOS 9 Apps with Swift» в Xcode 8 с Swift 2.3 и Swift 3.

Стэнфордский курс CS193P Spring 2016  «Developing iOS 9 Apps with Swift«  читался для Xcode 7 и Swift 2.2.

До момента выхода новой версии Xcode 8, каждая версия Xcode была привязана к определенной версии языка программирования Swift. Начиная с Xcode 8 это не так. Swift 3 представляет множество изменений и значительная часть этих изменений разрушает ваш проект, написанный на Swift 2.2 в Xcode 7.

К счастью, Xcode 8 позволяет сделать определенные установки проекта для того, чтобы оставаться с Swift 2.3, который практически совпадает с версией Swift 2.2 в Xcode 7. Это делается для тех проектов, которые не готовы моментально перейти на Swift 3. И это очень мудрое решение.

Apple обеспечила автоматическую миграцию в Xcode 8 проектов, разработанных в Xcode 7. При этом вас спрашивают, какую версию Swift вы выбираете при этой автоматической миграции: Swift 2.3 или Swift 3.0.

В Xcode 8 вы можете разрабатывать приложения для iOS 8, iOS 9 и iOS 10. Эти приложения могут работать с приборами (и соответственно симуляторами) начиная с iPhone 5 и выше, iPad Air  и выше, и iPad Pro (9,7 дюйма)  и выше.

Поскольку все демонстрационные примеры в нашем курсе  «Developing iOS 9 Apps with Swift» были выполнены  с применением  Xcode 7 и Swift 2.2, то логично перевести их в Swift 2.3 в Xcode 8, что и было сделано, все они находятся в Github и работают прекрасно. Кроме того, в ваше распоряжение предоставляются решения Заданий этого курса в Swift 2.3 в Xcode 8, которые находятся на Github.

Но если вы обновились до Xcode 8 и у вас есть хоть какой-то опыт программирования, то я рекомендую начать изучать курс сразу в Swift 3, так как демонстрационные приложения претерпели очень незначительные синтаксические изменения, не затрагивающие их смысловой характер. Кроме того, в вашем распоряжении Swift 3 версия всех демонстрационных примеров, находящаяся на Github. Кроме того, в ваше распоряжение предоставляются решения Заданий этого курса в Swift 2.3 в Xcode 8, которые находятся на Github.

Давайте более подробно рассмотрим оба варианта:  оставаться ли на Swift 2.3  или сразу работать на Swift 3. А вы, на основании этой информации, сами примите решение.

Читать далее

Обновление демонстрационных примеров и решений Заданий курса iOS 9 + Swift до Swift 2.3 и Swift 3.0

Вышли официальные версий Swift 2.3 и Swift 3.0iOS 10 и Xcode 8.   Поэтому я решила на своем сайте обновить демонстрационные примеры, сопровождающие замечательный стэнфордский курс CS193P Spring 2016  «Developing iOS 9 Apps with Swift»  до  Swift 2.3 и Swift 3.0 для запуска их в Xcode 8.

Также, как и в Xcode 7 , в Xcode 8 вы можете запустить эти демонстрационные примеры на своем устройстве (или поделится с друзьями) совершенно бесплатно — для этого не нужно иметь сертификат разработчика Developer Account,  стоимостью 99 $/год.

В 2016 году на стэнфордских курсах, как всегда, для большинства демонстрационных примеров не требуется реальное устройство (iPhone или iPad) и достаточно симулятора. Однако демонстрационные примеры, связанные с движением устройства и с использованием  Core Motion и iCloud, требуют привлечения реальных iPhone или iPad.

Две версии Swift в Xcode 8 присутствуют в следующем качестве: Swift 3 в качестве основной следующей версии Swift, но это ее первый релиз, который, конечно, будет корректироваться, а версия Swift 2.3 оставлена как переходная и стабильная версия для сложных приложений, уже разработанных на Swift 2.2 и находящихся в эксплуатации. Это очень мудрое решение в Xcode 8. Проект Swiftopen source, и вы можете следить за разработкой новых версий на сайте Swift.org. Там же можно вносить свои предложения.

Демонстрационные примеры  для курса CS193P Spring 2016  «Developing iOS 9 Apps with Swift»  для Swift 2.3 и Xcode 8 находятся в репозитарии на Github, а для Swift 3 .0 и Xcode 8 в этом репозитарии также на Github.

Надо сказать, что большинство демонстрационных примеров не претерпели никаких изменений в коде для Swift 2.3, за исключением очень незначительных изменений для демонстрационного примера Smashtag L11, в котором участвует Core Data. Поэтому , если вы обновились до Xcode 8, то код демонстрационных примеров для Swift 2.3 можно прекрасно использовать для прохождения курса  CS193P Spring 2016  «Developing iOS 9 Apps with Swift», а также для написания своего кода при выполнении Заданий.

Код демонстрационных примеров для Swift 3 .0 и Xcode 8 приведен для тех, кто  готов пройти курс сразу в Swift 3.0. О том, какой вариант Swift выбрать в Xcode 8 для прохождения курса  CS193P Spring 2016  «Developing iOS 9 Apps with Swift»  написан следующий пост.

Решения Заданий  для курса CS193P Spring 2016  «Developing iOS 9 Apps with Swift»  для Swift 2.3 и Xcode 8 находятся в репозитарии на Github, а для Swift 3 .0 и Xcode 8 в этом репозитарии также на Github.

Читать далее

Лекция 17 CS193P Spring 2016 — Segues, Core Location и MapKit.

Screen Shot 2015-12-27 at 2.26.54 PM

В Лекции 17 освещаются три основные темы:

  • Segues ( Modal, Unwind, Popover, Embed)
  • Core Location
  • MapKit

И в конце лекции начало большого демонстрационного примера, посвященного  картам и Segues, который продолжится на следующей Лекции 18.

Читать далее

Лекция 16 CS193P Spring 2016 — Notification и CloudKit.

Лекция 16 посвящена большому демонстрационному примеру на тему CloudKit. В самом начале Лекции делается очень короткое отступление для показа уведомлений Notifications, этих маленьких “радиостанций”.

В качестве демонстрационного примера создается приложение Pollster, которое позволяет вам с помощью CloudKit задавать вопросы с ответами и размещать все это в iCloud, чтобы люди могли отвечать на вопросы. Это дает возможность отслеживать сколько ответов получено на вопросы и т.д.

Начинается создание приложения с некоторого UI, который помогает нам задать вопрос и загрузить его в iCloud. Затем проектируется другой View Controller, который показывает список всех вопросов, находящихся в public базе данных, чтобы вы могли выбрать любой из них и добавить свой ответ. Пользовательский интерфейс приложения Pollster позволяет формировать новые вопросы и удалять старые, и все это происходит в iCloud. Для удобства работы пользователя выполняется подписка Subscription на вставку и удаление вопросов с Push Notifications (удаленными уведомлениями). Показано как распространить информацию, содержащуюся в  Push Notifications, которые обрабатываются в AppDelegate,  дальше, к тем View Controller, которые создавали определенные подписки Subscriptions и ожидают их результатов. Читать далее