Css-fhxb3m display-webkit-box; display-webkit-flex; display-ms-flexbox; display: flex-webkit-flex-direction: row-ms-flex-direction: row; flex-direction: row-webkit-align-items: center-webkit-box-align: center-ms-flex-align: center; align-items: center;. css-vlnsew width: 2.5rem; height: 2.5rem; margin-right: 0.5rem; overflow: hidden; border-radius: 9999px; Swifty Tech by Marco Eidinger
Почему ваша версия Xcode все еще имеет значение с помощью Module Stability
В этой статье блога вы узнаете о Module Stability в Swift и распространенном заблуждении о его совместимости со старыми версиями Xcode:
Вы узнаете, как справиться со следующей ошибкой при попытке использовать бинарный фреймворк ( .xcframework ).
Вы слышали о Module Stability в Swift и обещании совместимости с разными версиями компилятора. Вы думаете, что производитель бинарного фреймворка допустил ошибку, и готовы связаться с ним.
Остановка. Ошибка здесь в том, что вы не можете использовать бинарный фреймворк в приложении, которое использует более старый компилятор (Swift 5.6.1 == Xcode 13.4), чем тот, который использовался для генерации бинарного фреймворка (Swift 5.7 == Xcode 14).
Поставщик бинарного фреймворка должен был задокументировать это:
- Какую минимальную версию ОС поддерживает библиотека?
- Какую минимальную версию Xcode поддерживает библиотека?
Давайте сделаем шаг назад и проверим, что именно обещает Module Stability.
Отличными источниками о Module Stability являются
-
статья Донни Уола на сессии Swift.org WWDC 2019
- Стабильность модулей позволяет использовать модули Swift, созданные с разными версиями компилятора, вместе в одном приложении.
- Поддержка эволюции библиотеки позволяет разработчикам бинарных фреймворков вносить аддитивные изменения в API своего фреймворка, сохраняя бинарную совместимость с предыдущими версиями.
Бинарные фреймворки, построенные с помощью Module Stability, имеют Swift Module Interfaces – текстовое определение API своего фреймворка в составе генерируемых файлов .swiftinterface и .swiftmodule.
А поскольку они ведут себя как исходный код, будущие версии компилятора Swift смогут импортировать интерфейсы модулей, созданные в старых версиях.
Интерфейсы модулей не имеют обратной совместимости, они совместимы только вперед.
Интерфейсы модулей, созданные в данной версии компилятора Swift, гарантированно будут импортированы любым будущим компилятором Swift, поддерживающим верси ю-swift-, в которой они были скомпилированы.
Это происходит потому, что код @inlinable в файле .swiftinterface может использовать новый синтаксис, неизвестный старым компиляторам. [Источник].
Я также нашел интересное объяснение в этом замечательном ответе на форуме разработчиков Apple, которое объясняет относительные понятия обратной и прямой совместимости.
- Новый компилятор обратно совместим с текстовым интерфейсом двоичного файла, скомпилированного старым компилятором.
- Текстовый интерфейс старого двоичного файла совместим с новыми компиляторами Swift.
- Старый компилятор совместим в прямом направлении с текстовым интерфейсом двоичного файла, скомпилированного более новым компилятором.
- Текстовый интерфейс бинарного файла, созданного более новым компилятором, обратно совместим со старыми компиляторами Swift.
Кстати: если вы хотите узнать, какая версия Swift используется в той или иной версии Xcode, вы можете использовать следующий сайт в качестве справочника:
Вы нашли эту статью полезной?
Поддержите Марко Айдингера, став спонсором. Любая сумма будет оценена по достоинству!