Недавно обновив свои проекты до Swift 4, вот краткое руководство в надежде помочь кому-то сэкономить время.

Предварительные условия

Быстрый проект 3, компиляция и компоновка без проблем.

Как это работает

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

Шаг 1. Обновите подфайл.

Добавьте следующий фрагмент в свой Podfile и запустите pod install

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['SWIFT_VERSION'] = '3.2'
    end
  end
end

Это гарантирует, что поды скомпилированы для Swift 3.2.

Шаг 2. Преобразуйте проект.

Нажмите Изменить - ›Преобразовать -› Преобразовать в текущий синтаксис Swift.

Появится всплывающее окно со списком целей, включая модули.
Снимите выделение со всего, кроме цели проекта, модульных тестов и тестов пользовательского интерфейса, и нажмите "Преобразовать".
Подождите, пока проект построит, сгенерирует предварительный просмотр и применит перемены.

Исправьте все проблемы и предупреждения, связанные с новыми требованиями Swift 4. Если у вас есть сомнения, я предлагаю вам прочитать Руководство по миграции (или StackOverflow 😎).

Шаг 3. Обновите модули

Это самая сложная часть, вам нужно проверить, какие модули уже преобразованы в Swift 4, а какие все еще используют старый Swift 3.

Перед тем как начать, сделайте git-коммит, чтобы вы могли легко вернуться назад, если что-то не сработает. 😳

Сначала удалите фрагмент кода, добавленный на шаге 1 в Podfile, а затем запустите pod update.

Если вам повезет, все ваши модули уже доступны в Swift 4, и проект должен быть скомпилирован и готов к работе.

Если при сборке проекта некоторые поды не компилируются, перейдите на страницу подов на github и проверьте, преобразован ли он в swift 4.
Если он уже был преобразован, щелкните свой проект подов, выберите цель, которая не может быть скомпилирована. , перейдите в настройки сборки и убедитесь, что для Swift Language Version установлено значение Swift 4.

Делайте это до тех пор, пока проект не будет собран, и в конце у вас может быть несколько модулей, скомпилированных для Swift 4, а другие - для Swift 3.2.
Чтобы избежать необходимости изменять настройки сборки каждый раз при запуске модуля , вы можете добавить этот фрагмент в свой подфайл:

post_install do |installer|
        installer.pods_project.targets.each do |target|
            if ['Kingfisher', 'RxSwift', 'RxCocoa'].include? target.name
                target.build_configurations.each do |config|
                    config.build_settings['SWIFT_VERSION'] = '3.2'
                end
            end
        end
    end

Где вы можете указать, для каких модулей Swift Version будет установлена ​​на 3.2 (в этом примере Kingfisher, RxSwift и RxCocoa.

Теперь все готово, но у вас могут быть другие проблемы в зависимости от того, какие модули вы используете, и многих других переменных.

Надеюсь, это поможет ✌️