Лекция 7 CS193P Spring 2016 — Closures, Extensions, Protocols, Delegation и ScrollView

В Лекции 7 рассматривается ряд важных тем :

  • Управление памятью ссылочных типов
  • Замыкания и Захват в замыкании
  • Расширения
  • Протоколы
  • Делегирование
  • Scroll View

Классы, замыкания, функции — это ссылочные типы, которые “живут” в “куче” (heap). И эта память автоматически управляется iOS вместо вас. Такой режим работы называется “автоматический подсчет ссылок” (automatic reference counting) ARC, потому что работает схема подсчета ссылок, отслеживающая количество указателей объекты, и когда оно равно 0, память для этого объекта немедленно освобождается. Это отличается от “сборщика мусора”, который пробегает по “куче”, пытается найти то, на что никто не указывает, метит это, а потом все “выметает”. Это скачкообразный процесс и действительно непредсказуемый, в то время как  ARC полностью и абсолютно предсказуем.

При нормальной работе мы вообще не думаем об ARC. Но есть ситуации, когда бывает необходимо повлиять на его работу. Это можно сделать с помощью 3-х вещей: strong, weak и unowned. Профессор подробно рассказывает, что означают эти три ключевых слова и когда они применяются. В результате он приходит к выводу, что в Swift вы можете вообще с ними не встретиться, но в особых случаях возможно использование weak, использование strong вам никогда не понадобиться, потому что это значение по умолчанию, unowned — скорее всего никогда не понадобиться.

В теме «Замыкания» очень подробно рассматривается синтаксис замыкания и «захват» замыканием окружающего контекста, а также условия возникновения «циклических ссылок памяти» на конкретном примере сначале на слайдах, а затем и в демонстрационном примере. Обсуждается, что лучше использовать для разрыва «циклических ссылок памяти»: weak или unowned, и какие последствия того и другого. Демонстрационный пример наглядно показывает возникновение «циклических ссылок памяти» и как работают меры по его устранению.

Далее следует рассказ о замечательной синтаксической возможности в Swift, которая называется extension (расширения). extension разрешает добавлять методы и свойства в другие классы, даже если у вас нет исходного кода этих  классов. Например, вы можете добавлять extensions (расширения) к классам UIKit. Пол Хэгерти демонстрирует очень прагматичный пример использования extension класса UIViewController, которое упрощает использование  Navigation Controller в Split View Controller. Описаны все ограничения, накладываемые на свойства и методы в  extension,  и дано предупреждение о чрезмерном и логически необоснованном злоупотреблении синтаксисом extension.

Очень большое внимание в Лекции 7 уделяется протоколу protocol в Swift, как способу краткого выражения API ( Application Program Interface). Он позволяет вам иметь API, в котором вместо определения полного класса или структуры, которые вы собираетесь использовать, чтобы делать то, что вы делаете, вы можете определить точно, что вам от этого класса или структуры нужно. Протокол protocol — это просто декларация коллекции методов и свойств, но без «хранения». Далее Пол Хэгерти проводит мысль о том, что protocol в Swift— это ТИП и везде, где вы можете использовать ТИП, вы также можете использовать protocol. В том числе и в качестве ТИПА аргумента функции, и на эту тему он на слайдах показывает, какие это дает дополнительные возможности. Протоколы protocols в Swift имеют множественное наследование, в отличии от classes. Кроме того, возможно расширения extension протокола, которое обеспечивает частичную или полную реализацию protocol по умолчанию. Apple действительно проделала хорошую работу в Swift с протоколами protocols и расширениями extensions. Protocols — это реально очень важная часть утонченного программирования на Swift. Если вы хотите создать какую-то мощную сложную вещь, то вам придется иметь дело с protocols.

Далее представлено делегирование как способ “слепой” структурированной коммуникации между вашим View и вашим Сontroller или между различными MVCs, и как один из способов использования протоколов. Но профессор все время подчеркивает, что технология делегирования пришла из мира Objective-C. Он подробно рассказывает, как организовать эту технологию на примере использования Scroll View, у которого методы делегата UIScrollViewDelegate опираются на протоколы старого Objective-C  стиля. Этот стиль протокола в Swift маркируется ключевым словом @objc и позволяет иметь необязательные (optional) методы.  Но в Swift нет этих optional protocols. Там есть другой способ сделать то же самое — замыкания. И судя по материалам Лекции 7 и Заданию 3 профессор предпочитает именно этот способ «слепого структурированного» общения View  и Controller — с помощью замыканий. Пользуясь тем, что замыкания  захватывают переменные из окружающего контекста, вы можете сделать иногда исключительно элегантный код, который может быть лучшей заменой делегированию. 

Пол Хэгерти демонстрирует работу Scroll View, показывает как добавить subviews к Scroll View, как установить контентную область для прокрутки  и какие действия небходимо выполнить, чтобы  Scroll View заработал. Профессор подробно рассказывает о методах, с помощью которых можно определить, какая часть контентной области видна в данный момент времени, как управлять прокруткой программным образом и т.д.

В конце приведен демонстрационный пример создания Image View Controller, предназначенного для отображения изображений с возможностью прокрутки с  помощью  Scroll View. Показано, как заставить систему транспортной безопасности приложений (App Transport Security)  открывать Web-страницы с адресами  http://, так как по умолчанию это в Xcode 7 не разрешено. 

Лекции и слайды на английском языке представлены в iTunes название “7. Closures, Extensions, Protocols, Delegation, and ScrollView”. Код демонстрационного примера «Cassini L7» для Swift 3.0  и Xcode 8 код находится на Github, а для Swift 3 .2  и Xcode 9 — также на Github.

Русскоязычный неавторизованный конспект лекции 7, хронометрированный через каждые 5 минут, и представленный в виде PDF-файла, который можно скачать и использовать offline, а также Google Doc доступны на платной основе.

Лекция 7 CS193P Spring 2016 — Closures, Extensions, Protocols, Delegation и ScrollView: 5 комментариев

  1. Добрый день, Татьяна.

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

    • Для курсов по Swift пятничные лекции не выкладываются почему-то. Они выкладывались раньше, были не очень длинными, где-то на 30 минут и очень полезными. По-моему они актуальны и до сих пор, несмотря на то, что в старых лекциях язык программирования другой, логика работы с Source Control сильно не изменилась, так что можно посмотреть iOS 5 iPad and iPhone App Development (Fall 2011), Developing iOS 7 Apps for iPhone and iPad — в них есть пятничные сессии.
      Конечно, хотелось бы посмотреть отладку UI, например, но качество этих пятничных сессий сильно зависит от ведущего, а им не всегда является Пол Хэгерти. Когда читают другие — лично мне не нравится, так что сильно не расстраивайтесь из-за их отсутствия в iTunes.

    • Это, так называемая, «слабая» ссылка на объект, расположенный в «куче» (heap).
      Когда вы помещаете атрибут weak перед переменной var, то она вам говорит: “Ищите меня в “куче”, но если никто больше моим нахождением в “куче” не интересуется, то выбросьте меня из “кучи” и установите меня в nil. ”
      Получается, что weak работает исключительно с Optional, потому что они должны уметь устанавливаться в nil. Обо всем этом рассказывается в конце Лекции 6.

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