Xcode 9: el módulo compilado con Swift 3.1 no se puede importar en Swift 4.0


79

Después de actualizar a Xcode 9, intenté crear uno de mis proyectos.

Utilizo el pod de FacebookLogin . Tengo un error del compilador en FacebookLogin / LoginButton.swift

@testable import FacebookCore
❌ Module compiled with Swift 3.1 cannot be imported in Swift 4.0

En la configuración de compilación de mi objetivo, la versión de idioma Swift está configurada en Swift 3.2 .

Captura de pantalla agregada

Supongo que debo esperar a que Facebook actualice su pod. ¿O alguna otra sugerencia?

Gracias !


Puedes intentar follar eso.
JerryZhou

Respuestas:


73

Actualizar:

Solución también probada y funcionando en Swift 5 y Xcode 11.

Original:

Me gustaría agregar que si está utilizando Carthage para compilar un módulo en Swift 3.2, debe ir a una terminal y ejecutar:

sudo xcode-select --switch /Applications/Xcode-beta.app/Contents/Developer

Para usar las herramientas de línea de comando de Xcode 9, puede ejecutar:

carthage update NameOfTheLibrary --platform iOS --no-use-binaries

Esto compilará la biblioteca con sus herramientas de línea de comandos actuales, puede ser un poco lento, pero ahora el proyecto debería compilarse.

Nota

Para revertir y usar sus herramientas de línea de comandos de Xcode estables, simplemente ejecute:

sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer

1
Tuve el mismo error al usar el marco de Algolia, y lo construí con carthage y la herramienta de comando Xcode 9 funcionó bien. Gracias
vmeyer

3
Me funcionó usando SwiftyJson. ¡Gracias!
leandrodemarco

2
Me funcionó usando Alamofire
pachun

Hola @xaviPedrals, necesito tu ayuda ... Estoy tratando de ejecutar ese proyecto " github.com/swiftingio/SingTest " pero obteniendo ese error "El módulo compilado con Swift 3.1 no puede ser importado por el compilador Swift 4.2.1: / Users / aliapple / Desktop / SingTestByAhtazaz / Pods / AudioKit / iOS / AudioKit.framework / Modules / AudioKit.swiftmodule / arm64.swiftmodule ". ¿Puedes ayudarme en esto?
Ahtazaz

Hola @ Mr.Ahtazaz, ese proyecto es de hace 2 años, así que probablemente se hizo y compiló en Swift 3, primero el proyecto debe actualizarse a Swift 4 o 5, luego intente ejecutar el comando carthage carthage update NameOfTheLibrary --platform iOS --no-use-binariespara actualizar las bibliotecas y debería estar bien
xavi.pedrals

26

Xcode 9 viene con un compilador Swift 4 que comprende tanto Swift 3.2 como swift 4, incluso te permite mezclar y combinar entre las 2 versiones. Desafortunadamente, otras versiones no son compatibles.

Incluso si configura su idioma en Swift 3.2, utiliza el compilador Swift 4.

Si está usando cocoapods, puede agregar esto al final de su archivo de vaina para obligar a las vainas a usar Swift 3.2 o 4.0:

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

Alternativamente, puede colocar los archivos del pod directamente en su proyecto temporalmente, hasta que FacebookLogin se actualice a Swift 3.2 o 4.

Nota: Editado según los comentarios de Matt.


1
FYI: esto es demasiado agresivo al forzar a todos los módulos a Swift 4.0. Si un pod es compatible con Swift 3, puede pasar de manera segura a Swift 3.2. Pasar a 4.0 probablemente causará problemas de compilación para muchos pods.
Matt S.

19

Quizás puedas limpiar el objetivo antes de construirlo. Funciona bien para mí.


7
No funcionó para mí, todavía estoy buscando otra solución.
Arnaud

11

Me encontré con el mismo problema en Xcode 9 Beta 3, que apunta a 'Alamofire' y probé algunas soluciones diferentes, la más fácil que encontré es

1. CMD+SHIFT+K to clean the build
2. Restart Xcode 9 <-- make sure you do this step, that's critical. `

11
Es 2017 y todavía tenemos que reiniciar Xcode para solucionar errores. Gracias, Apple. Gracias.
Oded Harth

10

Hacer una "carpeta de compilación limpia" y reiniciar Xcode 9 limpió el error por mí. Además, el error no impidió que la aplicación se ejecutara en mi dispositivo o en el simulador.


1
"Limpiar carpeta de compilación": Para acceder a la opción, abra el menú Producto y use la tecla Opción para mostrar la opción Limpiar carpeta de compilación.
Hans

8

Vaya al directorio xcode DerivedData, luego elimine todos los archivos que contiene y vuelva a compilar su proyecto. funciona para mí.

y el directorio DerivedData predeterminado es: ~ / Library / Developer / Xcode / DerivedData.


8

Si usa Carthage , abra la terminal y;

carthage update --platform iOS --no-use-binaries

Si usa Pod , abra la terminal y;

pod update

(Además, si no funciona en el pod, puede cambiar SWIFT_VERSION en podfile Ex:

config.build_settings['SWIFT_VERSION'] = '3.2'

)

Después;

Abra Xcode y use;

Command+Option+Shift+K

ingrese la descripción de la imagen aquí


1
No publique respuestas idénticas a varias preguntas. Publique una buena respuesta, luego vote / marque para cerrar las otras preguntas como duplicadas. Si la pregunta no es un duplicado, adapte sus respuestas a la pregunta. Consulte meta.stackexchange.com/q/104227/311792
paper1111

@ paper1111 Explico todo en mi respuesta y funciona
SwiftDeveloper

Estoy usando Carthage y esta es la solución que funcionó para mí. La actualización de Carthage "My Framework" no fue suficiente. Tuve que actualizar todo el catálogo de Carthage. Tomó una eternidad pero funcionó.
Matan Guttman

1
Esta solución también funcionó para mí. Para estar seguro, asegúrese de cerrar y reiniciar xcode después de limpiar la carpeta de compilación con Comando + Opción + Mayús + K.
Torsten Ojaperv

@SwiftDeveloper ¿A dónde va la config.build_settingsporción?
Adrian

4

Esto funciona para mi.

1.Limpia tu proyecto en Xcode 8

2.Construya o ejecute su proyecto en Xcode 9


3

Limpié el proyecto en Xcode 9 y luego ejecuté la aplicación, funciona.


2

Tuve el mismo problema con Xcode 9 GM y esto resolvió mi problema: elimínelo del proyecto y arrástrelo nuevamente a "Embedded Binaries".


Tuve el problema con Alamofire 4.5.1 y probé todo lo demás en esta página a través pod updatepero sin resultado. Al final, agregué el marco directamente a mi proyecto y lo agregué a mis binarios integrados que funcionaron
Heki


1

yo tengo

pod 'FBSDKCoreKit'
pod 'FBSDKLoginKit'
pod 'FBSDKShareKit'

en mi proyecto y import FBSDKLoginKit, después de limpiar el objetivo, no tuve ningún problema

Dado que el pod que está utilizando está en swift y es un pod beta, es probable que tenga algunos problemas con el compilador de swift 4, por lo que debe usar la versión objetivo-c del pod por el momento


0

Si usa desde Pod:

  1. En Podfilecomentario FacebookLogin pod
  2. instalación de pod

  3. En Podfiledescomentar FacebookLogin pod
  4. instalación de pod

  5. Ejecute de nuevo su proyecto

0

Para mi caso, el pod real hacía referencia a un zip estático con binarios prediseñados que apuntan a Swift 3.1. Entonces, la única solución es reconstruir el marco con la fuente de xcode 9.

https://github.com/AudioKit/AudioKit/issues/980


Tengo un problema similar con AudioKit al que se hace referencia dentro de los pods. Sin embargo, su solución se refiere a un build_frameworks.sh que se encuentra en el 'Marco'. Agregue más detalles. No puedo encontrar ese archivo.
TomV

intente apuntar el podfile a una versión más reciente. una versión que ha sido construida con el último xcode 9 - / no se necesitan cambios en el script de construcción. github.com/AudioKit/AudioKit/releases
johndpope

Gracias por el consejo. Tuve que actualizar la versión de AudioKit en cocoapods a la última, que tenía build_frameworks.sh. Se necesitaba build_frameworks.sh para 'validar' AudioKit, para evitar que Apple rechazara la aplicación.
TomV
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.