Включение Грядущих Возможностей Языка Swift

29 марта 2023

Марсель Восс 22 марта 2023

Swift 6 несет множество изменений, которые переосмыслят сам способ использования Swift в будущем, причем некоторые из них - радикальные. Было бы кстати, если бы мы могли опробовать некоторые из этих предстоящих функций до их релиза, чтобы оценить их влияние на нашу кодовую базу и начать корректировать наш код уже сейчас? Хорошие новости: это возможно!

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

Добавив в раздел "Swift Compiler - Custom Flags" в Xcode новую метку компилятора-enable-upcoming-feature и дополнив ее метками свойств, которые мы хотели бы включить, компилятор включит для нас выбранные свойства. Например, если мы хотим включить любой экзистенциальный тип и проверку строгого параллелизма, мы можем предоставить компилятору такую метку: -enable-upcoming-feature ExistentialAny StrictConcurrency. StrictConcurrency здесь эквивалентен -warn-concurrency, как он есть в Swift 5.7 и ранее.

A screenshot showing the “Build Settings” tab in Xcode with the ‘-enable-upcoming-feature ExistentialAny’ added to the “Swift Compiler - Custom Flags” section.

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

ПРЕДЛОЖЕНИЕ ПО ИЗМЕНЕНИЯМ  |  МЕТКА СВОЙСТВА

SE-0274 - ConciseMagicFile

SE-0286 - ForwardTrailingClosures

SE-0335 - ExistentialAny

SE-0337 - StrictConcurrency

SE-0352 - ImplicitOpenExistentials

SE-0354 - BareSlashRegexLiterals

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

 

Идем Дальше

То же самое предложение также добавило новую директиву компилятора hasFeature, которая позволяет нам условно использовать новые функции Swift, при этом сохраняя возможность компиляции нашей кодовой базы с помощью более старой версии компилятора. Это может быть практично, если вы хотите обновить свою кодовую базу, чтобы она была готова к компиляции с использованием новых свойств Swift 6, сохраняя при этом возможность сборки вашего кода, используя старую версию компилятора. Или может нам просто захотелось поюзать эти функции. Жить на грани!

#if hasFeature(ImplicitOpenExistentials)
  f(aCollectionOfInts)
#else
  f(AnyCollection<Int>(aCollectionOfInts))
#endif

 

Мы даже можем выбрать эти новые свойства языка, когда разрабатываем для таргета SwiftPM, так как в SwiftSetting была добавлена новая функция, которая позволяет нам сообщать SwiftPM о грядущих функциях, которые мы хотели бы включить:

extension SwiftSetting {
  public static func enableUpcomingFeature(
    _ name: String,
    _ condition: BuildSettingCondition? = nil
  ) -> SwiftSetting
}

 

Оригинал статьи

Содержание