Как я могу использовать Realm со Swift 4?

Я пытаюсь запустить свой текущий проект в новой бета-версии Xcode 9, но когда я это делаю, он говорит Module compiled with Swift 3.1 cannot be imported in Swift 4.0. Как я могу решить эту проблему? Я не использую какаоподы.


person Lennart P.    schedule 19.06.2017    source источник


Ответы (2)


Обновление. Начиная с версии 2.10.1, выпущенной 14 сентября 2017 г., готовые двоичные файлы Realm включают в себя платформы, созданные с помощью Xcode 9 для Swift 3.2 и 4.0. Больше нет необходимости строить их самостоятельно.

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


Если вы в настоящее время интегрируете предварительно созданные двоичные файлы Realm, вам необходимо переключиться на сборку Realm из исходного кода, чтобы поддерживать Swift 3.2 и 4.0, поскольку Realm не публикует предварительно созданные двоичные файлы для предварительных версий Xcode. Вы можете собрать Realm из исходников одним из трех способов:

  1. Использование CocoaPods.

    CocoaPods всегда создает зависимости из исходного кода.

  2. Использование Карфагена.

    По умолчанию Carthage попытается загрузить готовые двоичные файлы, но вернется к сборке из исходного кода, если предварительно созданные двоичные файлы предназначены для версии Swift, отличной от используемой версии Xcode.

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

    Вы можете сделать это, проверив тег выпуска из Git:

    git clone --recursive https://github.com/realm/realm-cocoa.git
    cd realm-cocoa
    git checkout v2.10.0
    

    Затем запустите любую из следующих команд, соответствующую интересующей вас платформе, чтобы создать среду Realm Swift для этой платформы:

    REALM_SWIFT_VERSION=4.0 sh build.sh ios-swift
    REALM_SWIFT_VERSION=4.0 sh build.sh osx-swift
    REALM_SWIFT_VERSION=4.0 sh build.sh watchos-swift
    REALM_SWIFT_VERSION=4.0 sh build.sh tvos-swift
    

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

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

person bdash    schedule 19.06.2017
comment
Не могли бы вы объяснить третий вариант немного больше, пожалуйста? Но большое спасибо за ответ - person Lennart P.; 20.06.2017
comment
Есть ли что-то особенное, что вы хотели бы, чтобы я разъяснил? - person bdash; 20.06.2017
comment
Вы можете запустить их в Терминале в каталоге по вашему выбору. - person bdash; 20.06.2017
comment
Итак, я запустил эти команды в терминале, и после этого я запустил команду для iOS, но когда я пытаюсь запустить проект, он все равно отображает ту же ошибку. - person Lennart P.; 20.06.2017
comment
Интегрировали ли вы недавно созданную структуру в свое приложение? Если нет, ваше приложение по-прежнему будет использовать готовую структуру, а не ту, которую вы только что создали с помощью Swift 4.0. - person bdash; 20.06.2017
comment
После сборки для iOS фреймворки будут находиться в каталоге build/ios/swift-4.0 в исходном каталоге realm-cocoa. Вы хотите сказать, что не видите там фреймворков? - person bdash; 20.06.2017
comment
в папке realm-cocoa-master нет папки сборки. Где должна быть эта папка? - person Lennart P.; 20.06.2017
comment
Каталог создается, когда вы запускаете sh build.sh ios-swift или любую другую команду сборки, которую я перечислил. Если вы не видите каталог, я предлагаю поделиться выводом, который вы видите из вызова build.sh. - person bdash; 20.06.2017
comment
Я не смог собрать фреймворк, так как в нем отсутствовали некоторые исходные файлы. Есть еще один шаг, который нужно сделать после проверки исходников реалма. Из документации Realm: при клонировании из git требуются подмодули: git submodule update --init --recursive - person pteofil; 21.07.2017
comment
Хороший улов, @pteofil. Я добавил отсутствующий флаг --recursive к вызову git clone в ответе. - person bdash; 21.07.2017
comment
с Xcode 9 beta 4 и 2.9.0 я получаю: ** BUILD SUCCEEDED ** ... xcodebuild: ошибка: невозможно найти пункт назначения, соответствующий предоставленному спецификатору пункта назначения: {name:iPhone 6} Неподдерживаемый параметр спецификатора устройства. Устройство «Мой Mac» не поддерживает следующие параметры: имя Укажите только поддерживаемые параметры спецификатора устройства. - person addzo; 01.08.2017
comment
Кокаоподы автоматически знают, какой двоичный файл выбрать? - person Awesome-o; 14.10.2017
comment
@Awesome-о, я не уверен, что понимаю, о чем ты спрашиваешь. CocoaPods строит все зависимости из исходного кода. - person bdash; 14.10.2017
comment
Я думал, что Realm сделал что-то особенное здесь. Если это так, то источник RealmSwift совместим со Swift 4? Что-то особенное мне нужно сделать, чтобы заставить его работать, или он просто будет работать? - person Awesome-o; 14.10.2017
comment
@bdash Знаете ли вы, совместим ли исходный код RealmSwift со Swift 4? - person Awesome-o; 17.10.2017
comment
Да, Realm Swift совместим по исходному коду со всеми выпускаемыми версиями Swift, начиная со Swift 3.0 и выше. - person bdash; 18.10.2017

В качестве дополнения к пункту 3 bdash о том, как собрать Realm вручную из исходного кода, и чтобы ответить на вопрос addzo об ошибке xcodebuild (с которой я также столкнулся): убедитесь, что симулятор iPhone 6 настроен для вашего Xcode 9, чтобы избежать эта ошибка. Я полагаю, что скрипты сборки Realm должны быть нацелены на это. Во всяком случае, это решило это для меня.

person Smartcat    schedule 09.08.2017
comment
Просто новичок здесь, но если вы импортируете RealmSwift в файл appdelegate, вы получите эту ошибку, и если вы удалите импорт RealmSwift из этого файла appdelegate, ошибка исчезнет. Вы можете импортировать RealmSwift в другие соответствующие файлы. Я не использовал метод pods для включения RealmSwift, использовал метод, используемый в Lynda.com, с перетаскиванием фреймворков. Очень просто. - person Glenn Tisman; 21.02.2018