Какие версии Swift поддерживаются версиями Xcode?

Я разрабатываю приложения в Swift для жизни. Я наслаждаюсь языком и слежу за ним как можно ближе. Тем не менее, некоторые факты проскальзывают, будь то из-за меня, или Apple очень тихо относится к ним.

Сегодня я обнаружил, что Swift 3.3 и 3.4 существуют. Я исходил из того, что 3.2 была последней версией 3, для использования при переходе на 4, 4.2 и 5. Это ошибочное представление в основном связано с тем, что Swift.org, официальный Git repo и Примечания к выпуску Xcode вообще не упоминают их.

Итак, я предполагаю, что они также являются переходными, но я не знаю, в какой IDE или компиляторе они появляются, или с какими оговорками они идут. Ниже приведена таблица, которая обобщает мои знания:

 Приведенная ниже таблица устарела, предоставлена для контекста, поэтому вопрос имеет смысл. Я опубликовал обновленную версию этой таблицы в ответе ниже.

 A complex table with many versions of Swift and Xcode as the axes, and the support versions as the content

Что происходит с фиолетовыми пробелами? Специально для 3,3 и 3,4 строк, но если вы знаете другие, это тоже поможет!

Авторитетные источники также были бы потрясающими.


Возможные ответы на основной вопрос:

  1. Swift 3.3 был только в бета-версии Xcode 9.3 и никогда не становился общедоступным; Swift 3.4 был только в Xcode 9.3 - 9.4
  2. Swift 3.3 был поддержан только в Xcode 9.3; Swift 3.4 был поддержан в Xcode 9.3.1 и 9.4
  3. Swift 3.3 был поддержан в Xcode 9.3 и 9.3.1; Swift 3.4 был поддержан только в Xcode 9.4
  4. Swift 3.3 был поддержан в версиях Xcode 9.3 хотя 9.4; Swift 3.4 был поддержан только в бета-версии Xcode 10.

Я не думаю, что есть другая возможность. Дай мне знать, если я за пределами базы.

Ответ 1

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

Swift 3.x?

Когда началось развитие Swift 4 (и впервые официально объявлено на WWDC17), номер версии компилятора, отколовшегося от языка. (Это очень похоже на то, как, например, стандарт ANSI C имеет другое управление версиями из компиляторов clang и GCC.)

Номер версии языка отслеживает совместимость источника - самого определения языка, стандартной библиотеки и способа отображения SDK в платформе Apple в Swift. Если у вас есть код "Swift 3", вы должны скомпилировать его с версией 3 компилятора Swift или любой более поздней версией компилятора при использовании -swift-version 3.

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

Это означает, что сопоставление версий компилятора с возможными версиями совместимости с языками:

  • Язык Swift 3.2 - это "Swift 3 mode" для компилятора Swift 4.0
  • Swift language 3.3 - "Swift 3 mode" для компилятора Swift 4.1
  • Язык Swift 3.4 - это "Swift 3 mode" для компилятора Swift 4.2

Пока еще не выпущен Swift 5 (язык или компилятор), но когда это произойдет, скорее всего, это позволит -swift-version 4 режим в режиме " -swift-version 4 ", создав языковую версию "Swift 4.3". (Предполагая, что в будущих версиях Swift 4.x эти номера сначала не берутся.)

Я не знаю ни одного источника для этого ответа, но вы можете собрать его из:

История версий

Некоторые незначительные поправки к частям вашей диаграммы, которые находятся в прошлом:

  • Xcode 8 включал две отдельные версии компилятора, а не один компилятор с переключателем -swift-version. Xcode 8.3 остановлен, включая компилятор Swift 2.3, оставив Swift 3.1 единственным поддерживаемым языком Swift в этой версии.

  • Xcode 7/Swift 2 никогда не поддерживал компиляцию кода Swift 1.x, а только его перенос. Xcode 7.2 и более поздние версии, вплоть до текущей версии Xcode 10, по-прежнему включают в себя миграцию "Преобразовать в текущий быстрый синтаксис", которая теоретически поддерживает перенос с любой старой версии Swift.

  • Xcode 6.0 - 6.2.x поддерживает Xcode в OS X Mavericks (10.9). Xcode 6.3 первым требовал OS X Yosemite (10.10).

Дополнительные источники: старые загрузки Xcode.

Обескураженный?

Я не уверен, насколько хорошо применяется этот ярлык...

  • В то время, когда Xcode 8.x включал компилятор Swift 2.3, он полностью поддерживался для создания приложений и отправки в App Store. Вы могли бы сказать, что в то время это было "обескуражено", хотя Apple заявила, что она не будет придерживаться и что Swift 3.0 станет первой версией на языке, которая позже компилятор совместим с исходным кодом.

  • Swift 3.2 поддерживается/полностью поддерживается в Xcode 9 - в отличие от Swift 2.3 → 3.0, нет "выйти из этой версии, пока мы не отвлечем ее" от Apple или проекта Swift с открытым исходным кодом. Быстрые языковые версии 3.2, 3.3 и 3.4 явно существуют для того, чтобы позволить разработчикам поддерживать кодовые базы Swift 3, получая преимущества новых компиляторов и выпусков IDE.

Ответ 2

Поскольку я собираю данные и выполняю тесты, я опубликую результаты в виде обновленного графика в этом ответе:

A chart depicting the different versions of Swift as compared to their respective versions of Xcode. Last updated 2019-09-10

С тех пор, как я делал это в последний раз, я обнаружил, что более новые версии Xcode, на самом деле, не поддерживают миграцию со всех более старых версий Swift. Я явно проверил, что X-коды с 10.2 по 11 не поддерживают Swift 3.x и более ранние версии, поэтому я покрасил их в белый цвет. У меня еще не было времени протестировать Xcode с 8.3 по 10.1, но я подозреваю, что они перенесут 3.x, но не 2.x или более раннюю; вот почему сейчас большой фиолетовый блок.