Для чего нужна настройка Xcode «Swift Language Version»? Потому что он по-прежнему создает более новый код Swift с набором более старых версий - PullRequest
3 голосов
/ 11 февраля 2020

Я создаю исходный код, используя проект Xcode, для которого «Swift Language Version» установлено в «Swift 4». Даже с этим набором проект создает исходный код Swift 5.1, например, неявные возвраты и исходный код Swift 5, используя новый метод isMultiple(of:).

Код Swift 5 и 5.1 по-прежнему работает даже с "Swift" Языковая версия "установлена ​​на" Swift 4 "или" Swift 4.2 "

Только при выполнении операторов #elseif swift(>=4.1) существует разница (код из { ссылка }). Эти результаты дают ожидаемые результаты.

Однако мне интересно, как мой исходный код Swift 5 успешно компилируется, когда в настройке сборки четко указан Swift 4? И если настройка не меняет, какую версию Swift я могу использовать, что она на самом деле делает?

1 Ответ

2 голосов
/ 12 февраля 2020

До Swift 4 версия компилятора и язык были одинаковыми. Но начиная с Swift 4, компилятор может работать в режиме совместимости с предыдущими версиями Swift. проверьте больше информации о режимах совместимости в заметках о выпуске Swift 4.0

Параметр сборки Xcode SWIFT_VERSION устанавливает флаг компилятора -swift-version, который является языковым режимом. В распечатанном ниже компиляторе swift этот параметр только изменяет интерпретацию ввода.

swiftc -h|grep 'Swift language version number'
  -swift-version <vers>   Interpret input according to a specific Swift language version number

Таким образом, при выборе версии Swift Language до 4.2 это не означает использование компилятора Swift 4.2. Версия компилятора по-прежнему будет 5.1.3, настройка Swift Language Version дает команду компилятору работать в режиме совместимости Swift 4.2. Режим совместимости означает, что вам может не понадобиться изменять код swift 4.2 для использования новой версии компилятора. Потому что компилятор, работающий в режиме совместимости, позволяет скомпилировать и запустить код Swift версии 4.2 вместе с кодом версии 5 и выше.

compiler options

Компилятор Swift 5 с режимом совместимости может компилировать код, написанный с использованием либо синтаксиса Swift 4 , Синтаксис Swift 4.2 или Синтаксис Swift 5 .

Вот пример кода, создайте файл test.swift с кодом ниже:

//code written before siwft 5
let firstName = "michael jackson"
let offset = firstName.endIndex.encodedOffset

// Check swift version being used.
#if swift(>=5.2)
print("Hello, Swift 5.2")

#elseif swift(>=5.1)
print("Hello, Swift 5.1")

#elseif swift(>=5.0)
print("Hello, Swift 5.0")

#elseif swift(>=4.2)
print("Hello, Swift 4.2")

#elseif swift(>=4.1)
print("Hello, Swift 4.1")

#elseif swift(>=4.0)
print("Hello, Swift 4.0")

#endif

предположим, что приведенный выше код был написан до swift 5 с использованием компилятора swift 4, с которым этот код будет компилироваться ошибок нет, как показано ниже.

enter image description here

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

Swift 5 compiler

Вы получите предупреждение, показанное выше, поскольку encodedOffset устарело в swift 5.

Вы можете понизить версию и использовать компилятор swift 4 или вы можете использовать компилятор Swift 5 в режиме совместимости с флагом компилятора -swift-version, как показано ниже.

Swift 5 compiler with compatibility mode

Важно отметить, что * Компилятор 1054 * Swift 4 и компилятор Swift 5 в режиме совместимости Swift-4 - это не одно и то же. Новые функции языка swift 5 обычно доступны для компилятора swift 5, работающего в режиме совместимости. Это позволяет разработчикам использовать новые функции, даже если они не могут выполнить обновление до Swift 5. Новые функции Swift 5 не будут доступны для Swift 4 компилятора .

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