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 !

Arnaud
fuente

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
xavi.pedrals
fuente
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.

klinger
fuente
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í.

TomorJM
fuente
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. `
Xu Yin
fuente
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.

John Pavley
fuente
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.

reco
fuente
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í

Desarrollador rápido
fuente
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

RayJiang
fuente
3

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

Shan Ye
fuente
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".

Francisco Pereira
fuente
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
2

Carpeta de construcción limpia

Cmd + option + shift + K
Vineesh TP
fuente
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

thibaut noah
fuente
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
Hamed
fuente
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

johndpope
fuente
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