Напоминание: Swift по-прежнему не является стабильным для ABI!

Прежде чем мы начнем, я просто хотел бы напомнить всем, что Swift все еще не является стабильным ABI. Это означает, что двоичные файлы, созданные с помощью предыдущих версий Swift, несовместимы с компилятором текущей версии. Проще говоря, это означает, что все ваши файлы и зависимости должны быть скомпилированы с одной и той же версией Swift; вы не можете смешивать и сопоставлять код, написанный в другой версии Swift.

Apple пытается смягчить это, сделав Swift 3.0 последней версией с (серьезными) критическими изменениями (без обещаний). Стабильность ABI намечена на Swift 4.

Стоит ли обновляться до 2.3 или 3.0?

Если у вас есть значительная база кода Swift - как мы делаем здесь, в VTS - ответ на это:

Да, оба.

Если ваша база кода Swift невелика, вам следует пропустить 2.3 и перейти к 3.0.

Вот несколько вещей, о которых следует помнить:

  1. Зависимости важны. Обязательно проверьте, поддерживают ли ваши зависимости Swift 2.3 или Swift 3.0 - большинство основных библиотек / фреймворков поддерживают оба (Alamofire, Charts). Однако следует иметь в виду, что обновление до версии 3.0 возможно только в одном направлении. Поскольку новая разработка Swift будет происходить в Swift 3.0, версии 2.3 всех ваших зависимостей, скорее всего, будут заморожены без обновлений.
  2. В некоторых версиях Xcode 8.x будет удалена поддержка Swift 2.3. Swift 2.3 предназначен быть промежуточным этапом для более крупных проектов, для которых потребуется больше усилий для обновления до 3.0.
  3. Если у вас есть частные CocoaPods, которые используются в нескольких проектах, вам сначала необходимо обновить их.

Вы можете перейти на 2.3, но неизбежное откладывается: вам все равно придется перейти на Swift 3 до выпуска Xcode 9.

Проблемы миграции со Swift 2.2 на 2.3

Мигратор может перенести Range ‹T› на CountableRange ‹T›. CountableRange ‹T› существует только в Swift 3.

Мигратор добавит комментарий / * Migrator FIXME: используйте переменную типа DispatchSpecificKey * / для использования dispatch_queue_set_specific (). Это актуально только для будущего перехода на Swift 3.

Проблемы миграции с 2.x на 3.0

Версия 3.0 Swift - это релиз, «ломающий все». Swift 3 предназначен для того, чтобы сломать все и избавиться от всего, что не приносит пользы языку в долгосрочной перспективе. Это означает, что многое изменится, и вам придется изменить многое, чтобы ваши проекты соответствовали требованиям.

Swift 2.3

Swift 2.3 - это очень незначительное обновление. Насколько незначительно? Фактически, есть только одно изменение: проверка допустимости значений NULL во время компиляции кода Objective-C в обновленных Apple SDK.

Другие изменения включают небольшое переименование, и многие дополнительные инициализаторы теперь возвращают предполагаемый объект вместо дополнительных. Это применимо к таким вещам, как создание экземпляров пера из пакета.

Swift 3.0

Основные изменения (что вы можете заметить)

Определение частного было изменено, и теперь добавлено слово fileprivate

То, что раньше было частным, теперь является частным. Доступ к переменной fileprivate можно получить внутри расширения. Доступ к частной переменной в расширении класса невозможен.

Узнать больше об этом изменении

Определение понятия "публичный" изменилось, и теперь вводится слово "открытый"

В настоящее время объявление класса или параметра общедоступным предоставляет две возможности:

  1. Это позволяет внешним модулям использовать класс / член.
  2. Это позволяет внешним модулям переопределять класс / член.

В Swift 3 public означает внешнее использование, но не переопределение. Предыдущая функциональность инкапсулируется open.

Узнать больше об этом изменении

Глаголы и существительные

Функции, заканчивающиеся на -d, возвращают новый экземпляр этого объекта.

Это изменение применяется к обратному и обратному, перечислению и перечислению и т. Д.

Логические значения Objective-C теперь предваряются словом is, а типы Foundation больше не имеют префикса NS (если нет конфликта - например, NSString все еще имеет префикс, поскольку в противном случае он бы конфликтовал с Нить).

Типы Foundation теперь прекрасно сочетаются с объявлениями let и var в Swift.

Узнать больше об этом изменении

Импортировать как участник

Аннотированные функции C импортируются как методы. Обычно импортер может выводить эти сопоставления автоматически, а это означает, что использование старых C-API кажется естественным и родным для Swift. Дело в том, что CoreGraphics API. CoreGraphics не обновлялось в этом выпуске (кроме аннотаций).

Подробнее об этом изменении

Изменения оболочек верблюдов

UpperCamelCase заменен на lowerCamelCase в перечислениях и свойствах, которые начинаются с акронима.

// Before
let red = UIColor.redColor().CGColor
// After
let red = UIColor.red.cgColor

(Мое наименее любимое изменение) Условия измененной структуры

Вы больше не можете использовать ключевое слово where в операторах guard, if и while. Ключевое слово where по-прежнему применяется к циклам for в форме for-in-where.

Также есть некоторые изменения в положениях о делах.

Узнать больше об этом изменении

Согласованные ярлыки первого аргумента

Это довольно легко понять: теперь по умолчанию требуются первые имена параметров.

Узнайте больше об этом изменении.

(Мое любимое изменение) Обработка неявно развернутых опций

Я думаю, что одно это изменение стоит процесса миграции, если у вас есть проект с общими языками. Так что это?

Типы Objective-C, которые ранее имели свойства ImplicitlyUnwrappedType! теперь есть тип WrappedType ?. Это применимо везде, кроме этого случая:

Узнать больше об этом изменении

Улучшенный перевод API Obj-C

Именование стало более понятным.

Узнать больше об этом изменении

Модернизированная отправка

Узнать больше об этом изменении

У типов коллекций появилась новая модель.

Раньше, когда вы хотели перейти от одного индекса к другому в типе коллекции, вы использовали бы метод-преемник индекса. Теперь эта ответственность была перенесена в коллекцию, так что теперь вы пишете c.index (после: index). Коллекции теперь могут иметь индекс любого типа Comparable.

(Следующая часть применима только в том случае, если вы вручную создаете объекты Range. Я не думаю, что кто-либо из нас это делает)

В качестве побочного эффекта этого изменения Range был разделен на несколько типов: Range, ClosedRange, CountableRange и CountableClosedRange. ClosedRange теперь включает диапазоны, охватывающие максимальное значение типа (0… Int8.max). Range и ClosedRange больше не являются итерируемыми - теперь для их привязки требуется только объект Comparable (так что вы можете создать Range ‹String›).

Узнайте больше об этом изменении.

Идентификатор цели C импортируется как любой тип Swift

Цитируя Apple,

Поскольку «id» теперь импортируется как «Any», а не как «AnyObject», вы можете увидеть ошибки там, где ранее выполняли динамический поиск по «AnyObject».

Узнайте больше об этом изменении.

Небольшие изменения (вещи, которые вы можете не заметить)

Необязательные операторы сравнения удалены

В настоящее время сопоставимы нулевые типы. Случай и точка:

Это позволяет очень легко писать такие ошибки:

Теперь вам нужно развернуть вещи, прежде чем сравнивать их:

Это одна из тех вещей, которая действительно хороша, но, скорее всего, разрушит ваши модульные тесты.

Узнайте больше об этом изменении.

Имена и ярлыки параметров закрытия

Многие имена параметров закрытия были переименованы или сделаны необязательными.

Пример:

flatten переименован в объединенный

Узнайте больше об этом изменении.

Обработка UnsafePointer ‹T›

Допустимость значений NULL для типов указателей, не являющихся объектами, представлена ​​с помощью дополнительных параметров.

Узнайте больше об этом изменении.

Теперь за округление значений с плавающей запятой отвечает само значение.

Раньше мы использовали глобальные C-функции floor и ceil для округления типа с плавающей запятой. Эти функции по-прежнему доступны, но рассматриваются как устаревшие.

Вместо этого теперь мы должны сделать следующее:

Существуют дополнительные правила округления, например:

  1. toNearestOrAwayFromZero
  2. toNearestOrEven
  3. к нулю
  4. awayFromZero

Узнать больше об этом изменении

Псевдонимы универсального типа

Узнать больше об этом изменении

Изменение синтаксиса объявления оператора

Узнать больше об этом изменении

Константы Objective C теперь являются типами Swift

Мы больше не используем именованные строки для взаимодействия obj-c.

Узнать больше об этом изменении

Вещи такие маленькие, что тебе, наверное, плевать

NSError улучшил мост

Узнайте больше об этом изменении.

nulTerminatedUTF8CString переименован в utf8CString

Узнать больше об этом изменении

Удаление повторяющегося инициализатора UnicodeScalar строки

Узнать больше об этом изменении

Неисправные инициализаторы UnicodeScalar теперь возвращают необязательный параметр.

Узнать больше об этом изменении

Больше не нужно разбивать кортежи

Узнать больше об этом изменении

Больше не нужно выполнять каррирование синтаксиса объявления func.

Узнать больше об этом изменении

Это все изменения в Swift 3?

NO.

Есть предложения по этому выпуску, которые все еще находятся на рассмотрении. Несколько предложений были перенесены на версию 3.x, и я также решил не включать некоторые дополнения и изменения, которые, как мне казалось, были очень незначительными - например, удаление или слияние некоторых редко используемых вызовов API.

Кроме того, я не обязательно вдавался в подробности каждого из этих отдельных изменений, а вместо этого решил дать общий обзор каждого изменения. Некоторые изменения имеют некоторый волновой эффект по своему объему, и если вас интересует специфика этих изменений, вам действительно стоит посетить Swift EVO project.

Изменения для этого выпуска находятся на активном рассмотрении / ожидают рассмотрения

  1. Добавить в Словарь инициализаторы на основе последовательностей и методы слияния
  2. Разрешить использование дополнительной привязки для обновления себя со слабой ссылки до сильной
  3. Добавить AnyHashable в стандартную библиотеку

Изменения отложены до выпуска 3.x

  1. Алгоритм поворота
  2. Удаление себя
  3. Разрешить типам Swift предоставлять пользовательские представления Obj-C
  4. Убрать переходное преобразование из динамического приведения
  5. Рационализация названий конечных операций последовательности

Бонус:

То, что, я уверен, мы все рады, было отвергнуто:

  1. Удаление откуда из языка Swift
  2. Требовать от себя доступа к членам экземпляра
  3. Удаление модификаторов доступа из расширений

Чтобы узнать больше, подпишитесь на меня в среде или в твиттере @_IronHam