Статьи

Чего ожидать от Swift 3

Вы, наверное, знаете, что Swift 3 появится позже в этом году. Это первый релиз, который включает в себя тяжелую работу фантастического сообщества. Со времени открытия Apple Swift в 2015 году были представлены десятки предложений, и десятки были приняты после тщательного рассмотрения основной командой. В этой статье мы рассмотрим некоторые важные изменения в Swift 3.

Основная команда имеет очень ясную цель с выпуском Swift 3, создавая прочную основу для языка программирования Swift. На WWDC 2016 Крис Латтнер подчеркнул, что Swift 3 вводит ряд принципиальных изменений с целью получения правильных основ. Это общая тема предстоящего релиза. Это означает нарушение существующих функций, удаление некоторых функций и улучшение основы языка.

Проект развития Swift стал настоящим успехом для всех, кто участвует в сообществе Swift. Вовлечение было огромным, и в результате Swift 3. Apple прозрачна в процессе выпуска, и снимки Swift 3 доступны на веб-сайте Swift и включены в Xcode 8, который находится на стадии бета-версии на момент написания.

Выпуск Swift 3 не только фокусируется на языке программирования Swift, но также включает существенные изменения в наборе инструментов, стандартной библиотеке и взаимодействии языка с Cocoa. Помните, что Swift — это больше, чем язык. Когда мы говорим о Swift, мы обычно думаем только о языке, но он также включает в себя стандартную библиотеку и менеджер пакетов.

Если вы работали со Swift, то вы знаете, что перенос кодовой базы из одной версии в другую — это не маленький подвиг. К сожалению, перенос проекта в Swift 3 не будет исключением.

Тем не менее, основная цель Swift 3 состоит в том, чтобы переход от Swift 3 к будущим версиям языка не был таким. Совместимость с источниками является ключевым моментом Swift 3.

Swift был разработан, чтобы быть современным языком программирования, но не менее важно было создать язык, который выглядел бы красиво и был … ну … удивительным. С Swift 3 команда продолжает «оптимизировать язык для удивительности», как выразился Крис Латтнер.

В то время как есть много серьезных изменений, чистый результат — язык, который чувствует и выглядит великолепным. Swift 3 — это радость в использовании. Изменения в Core Graphics и Grand Central Dispatch, о которых мы сейчас поговорим, являются прекрасными примерами.

Достаточно о том, насколько крут Swift и насколько он будет крут. В оставшейся части этой статьи я хотел бы сосредоточиться на некоторых ключевых изменениях, представленных в Swift 3. Имейте в виду, что Swift 3 продолжает развиваться до официального выпуска в конце этого года.

Много времени и энергии было потрачено на улучшение API языка Swift. Изменения значительны, отрицать это невозможно. Но результат очень и очень хороший. С Swift 3 основная команда стремится к API, который фокусируется на удобочитаемости и доступности.

В то время как многие из нас привыкли к многословности Objective-C, новый Swift API использует другой подход, только подчеркивая и концентрируясь на основных моментах. Взгляните на следующий пример Swift 2.2.1. Этот пример должен выглядеть знакомо, если вы потратили некоторое время на Swift … или Objective-C.

1
parentViewController.presentViewController(newViewController, animated: true, completion: nil)

В Swift 3 этот фрагмент кода выглядит немного иначе, как вы можете видеть ниже.

1
parentViewController.present(newViewController, animated: true, completion: nil)

Сообщество Swift осознало, что нет необходимости включать ссылку на то, что должно быть представлено, так как эта информация уже включена в первый параметр. В результате имя метода становится более читабельным и более кратким. Определенное улучшение, если вы спросите меня.

Это общая тема в Swift 3. Некоторые из предложений, которые были приняты и включены в Swift 3, сосредоточены на упрощении и удалении лишних слов. На Swift API изначально сильно повлияла многословная природа Objective-C. Читаемость отличная, но Swift 3 сокращает многословность без ущерба для читаемости.

Сообщество Swift считает, что дизайн API должен всегда учитывать использование API, и это ясно видно из изменений, представленных в Swift 3. Я уверен, что вы согласны с тем, что обновленный API выглядит — и читает-большой.

Другим важным изменением, которое приветствуют многие разработчики, является непротиворечивая подпись функций и методов, включая метку первого параметра по умолчанию. Так выглядит типичная функция в Swift 2.2.1. По умолчанию метка первого параметра опускается при вызове функции.

1
2
3
4
5
func setupView(view: UIView, withConfiguration configuration: Configuration) {
    // …
}
 
setupView(view, withConfiguration: configuration)

Это больше не верно в Swift 3. Первый параметр больше не получает специальной обработки, что является очень желанным изменением.

1
2
3
4
5
func setupView(view: UIView, withConfiguration configuration: Configuration) {
    // …
}
 
setupView(view: view, withConfiguration: configuration)

Из-за этого изменения вы могли бы еще больше улучшить приведенный выше пример, пропустив ссылку на представление в имени функции.

1
2
3
4
5
func setup(view: UIView, withConfiguration configuration: Configuration) {
    // …
}
 
setup(view: view, withConfiguration: configuration)

Работа с C API в Swift всегда выглядела неуклюже. Например, функции Core Graphics импортируются как глобальные функции, что не является хорошим решением, и в результате использование Core Graphics в Swift выглядит не очень хорошо.

То же самое относится и к Grand Central Dispatch. В следующем примере мы используем Grand Central Dispatch для асинхронной отправки задачи в фоновую очередь.

1
2
3
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
    // …
}

В Swift 3 API выглядит намного больше, чем нативный Swift API. Функции импортируются как методы, что приводит к следующему синтаксису в Swift 3.

1
2
3
DispatchQueue.global(attributes: .qosBackground).async {
    // …
}

Сообщество Swift также согласилось с удалением ряда функций, некоторые из которых вызвали несколько жарких дискуссий. Я хотел бы указать на четыре из них.

Вам это знакомо?

1
2
3
for (var i = 0; i < 5; i++) {
    print(i)
}

С-стиль for петель больше не доступен в Swift 3. Подождите. Какая? Почему? Это очень хороший вопрос. Вы можете прочитать предложение , представленное Эрикой Садун , на GitHub. Это подводит нас к следующему противоречивому изменению.

Вскоре после открытия программного обеспечения Swift Крис Латтнер, создатель Swift, представил предложение об удалении из языка операторов увеличения и уменьшения. В своем предложении он упоминает, что эти операторы были добавлены «без особого рассмотрения» в начале разработки Swift. Чтобы очистить Swift API и избежать путаницы, ++ и -- больше не доступны в Swift.

1
2
var a = 0
a++

Не паникуйте, хотя. Решение простое. Не надо беспокоиться.

1
2
var a = 0
a += 1

Если вы знакомы с функциями в Swift, то вы знаете, что параметры функции по умолчанию постоянны. Вы можете изменить это поведение, добавив к имени параметра ключевое слово var . Для переменных параметров переменная копия параметра передается в функцию.

Но как это отличается от параметров, помеченных как inout ? Правильно. Это именно то, что многие из нас задавались вопросом, и это мотивация для удаления переменных параметров из языка.

С точки зрения функции, нет никакой разницы, то есть функция получает изменяемую локальную копию значения параметра. Однако, как следует из названия, параметр, помеченный как inout записывает свое значение обратно в исходную переменную.

Чтобы избежать путаницы, параметры var больше не доступны в Swift 3. К счастью, inout параметры здесь остаются.

Говоря о параметрах inout , в Swift 3 ключевое слово inout интегрировано в синтаксис типа параметров функции. Взгляните на следующие примеры, чтобы лучше понять это изменение.

1
2
3
4
5
6
7
8
9
// Swift 2
func combineStrings(inout first: String, second: String) {
    // …
}
 
// Swift 3
func combineStrings( first: inout String, second: String) {
    // …
}

Несмотря на то, что Swift еще очень молод, существует множество довольно продвинутых функций. Знаете ли вы, что вы можете передать кортеж функции вместо списка параметров? Нет нужды подбадривать. Эта функция будет удалена в Swift 3.

01
02
03
04
05
06
07
08
09
10
11
12
// Pass Arguments As Separate Arguments
 
let view = UIView()
let configuration = Configuration()
 
setupView(view, withConfiguration: configuration)
 
// Pass Arguments As Part of Tuple
 
let tuple = (view, withConfiguration: configuration)
 
setupView(tuple)

Крис Латтнер называет это поведение «симпатичным» в своем предложении удалить эту функцию . Хотя такое поведение может быть полезным время от времени, похоже, оно имеет довольно много последствий. Причиной появления этого предложения является выделение основной цели основной команды, упрощение синтаксиса и API языка.

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

На прошлой неделе я писал о Xcode 8 . В той статье я упоминал, что Xcode 8 поддерживает Swift 2.3 и Swift 3. Но что такое Swift 2.3 и как он сравнивается с Swift 2.2?

Swift 2.3 — это небольшое, но важное обновление Swift. Основное отличие Swift 2.2.1, версии, включенной в Xcode 7.3.1, заключается в совместимости с SDK для новых операционных систем Apple, iOS 10, tvOS 10, watchOS 3 и macOS Sierra (10.12).

Это означает, что вы можете использовать и создавать новые SDK, не переходя на Swift 3. С Xcode 8 вы можете отправлять приложения в App Store с помощью Swift 2.3 или Swift 3. Команда Swift знает и понимает, что переход на Swift 3 оказывает значительное влияние на существующие проекты, которые включают Swift. Swift 2.3 гарантирует, что вы можете перенести свои проекты, когда считаете нужным.

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

Во время WWDC мы уже увидели изменения, внесенные в документацию. Хотя это может показаться тривиальным, задумывались ли вы о том, сколько времени вы тратите на просмотр документации? У меня есть слабость к таким деталям, и я ценю усилия, приложенные командой для того, чтобы сделать документацию более доступной. Изменения еще более драматичны в Xcode 8, как я писал на прошлой неделе .

На данный момент подавляющее большинство разработчиков Swift используют Xcode в качестве рабочей лошадки. Это может измениться в будущем, поскольку язык приобретает популярность на других платформах. У Google не было планов использовать Swift на Android ?

В Xcode 8 интеграция Swift значительно улучшена. Например, навигация по стандартной библиотеке более интуитивна. На одной из сессий WWDC 2016 Ева Матейска демонстрирует, как синтезированные интерфейсы стали более интуитивными и понятными. Это делает просмотр стандартной библиотеки менее сложным.

Это подводит нас к компиляции и оптимизации. Возможно, вы слышали об оптимизации всего модуля. Эта функция теперь включена по умолчанию в XCode. Это влияет на производительность приложений, и Apple рекомендует включить эту функцию в производстве. Если вы хотите узнать больше об оптимизации всего модуля, я рекомендую прочитать эту статью Кейта Харрисона .

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

Swift 3 является важной вехой для всех участников сообщества Swift. Несмотря на то, что никто не любит прерывать изменения, направление, в котором движется язык, становится более понятным, делая платформу более надежной и готовой к будущим изменениям без ущерба для совместимости с исходным кодом.

В этой статье я выделил несколько наиболее важных изменений, которые вы можете ожидать в Swift 3. Для получения полного списка изменений я рекомендую вам посетить руководство по миграции на веб-сайте Swift .

Вы также можете посетить проект Swift Evolution на GitHub, чтобы узнать больше о предложениях, которые были приняты, и о тех, над которыми еще ведутся работы. Не бойся. Предложения часто легко понять. На самом деле, цель проекта Swift Evolution — дать каждому возможность присоединиться к обсуждению. Что вам мешает?