¿Puedo mezclar Swift con C++? Como los archivos Objective-C .mm

Resuelto EhTd asked hace 10 años • 13 respuestas

Acabo de cambiar mis archivos .m a .mm y uso C++. ¿Hay alguna manera de hacer lo mismo con Swift?

EhTd avatar Jun 04 '14 23:06 EhTd
Aceptado

La confusión puede surgir de la suposición de que simplemente cambiar una extensión de archivo de .ma .mmes todo lo que necesita para unir los idiomas, cuando, en realidad, no hace nada de ese tipo. No es el .mmque causa fricción con .cpp, es el .hencabezado el que definitivamente no debe ser un C++encabezado.


Mismo proyecto: Sí.

En el mismo proyecto, puedes mezclar felizmente C , C++ , Objective-C , Objective C++ , Swift e incluso Assembly .

  1. ...Bridging-Header.h: expones C , Objective-C y Objective-C++ a Swift usando este puente
  2. <ProductModuleName>-Swift.h: expone automáticamente tus clases Swift@objc marcadas con Objective-C
  3. .h: esta es la parte complicada, ya que se usan de manera ambigua para todas las versiones de C , ++ o no, objetivo o no. Cuando a .hno contiene una sola palabra clave de C++ , como class, se puede agregar a ...Bridging-Header.hy expondrá cualquier función .c o .cpp funcionalidad correspondiente que declare. De lo contrario, ese encabezado debe estar incluido en una API C pura o Objective-C .

Mismo archivo: No.

En el mismo archivo, no puedes mezclar los 5. En el mismo archivo fuente :

  1. .swift: no puedes mezclar Swift con nada
  2. .m: puedes mezclar Objective-C con C . ( @Vinzzz )
  3. .mm: puedes mezclar Objective-C con C++ . Este puente es Objective-C++ . ( @Vinzzz ).
  4. .c: C pura
  5. .cpp: puedes mezclar C++ y ensamblador ( @Vality )
  6. .h: C , C++ , Objective-C u Objective-C++ ubicuo y ambiguo , entonces la respuesta es que depende.

Referencias

  • Invocar ensamblaje desde C++ ( Brett Hale )
  • Invocar Swift desde Objective-C ( Svitlana )
  • Invocar C, C++, Obj-C, Obj-C++ desde Swift ( SwiftArchitect , self)
  • Para descargar un proyecto completo de iOS 9 y Xcode 7, busque SO-32541268 en Swift Recipes.
SwiftArchitect avatar Sep 13 '2015 20:09 SwiftArchitect

No. Cuando cambias de .m a .mm, en realidad estás cambiando de Objective-C a un lenguaje diferente (que tiene muchas diferencias sutiles) llamado Objective-C++. Entonces realmente no estás usando C++; estás usando Objective-C++, que acepta la mayor parte de C++ como entrada (de la misma manera que C++ acepta la mayoría, pero no todo, C como entrada). Cuando digo que no es del todo C++, considere un archivo C++ que incluya una variable denominada nil(que es C++ legal) y luego intente compilarlo como Objective-C++.

Swift no tiene la misma relación. No es un superconjunto de C o C++ y no puedes usarlo directamente en un .swiftarchivo.

"Usar Swift con Cocoa y Objective-C" también nos dice:

No puede importar código C++ directamente a Swift. En su lugar, cree un contenedor Objective-C o C para código C++.

Rob Napier avatar Jun 04 '2014 16:06 Rob Napier