¿Puedo mezclar Swift con C++? Como los archivos Objective-C .mm
Acabo de cambiar mis archivos .m a .mm y uso C++. ¿Hay alguna manera de hacer lo mismo con Swift?
La confusión puede surgir de la suposición de que simplemente cambiar una extensión de archivo de .m
a .mm
es todo lo que necesita para unir los idiomas, cuando, en realidad, no hace nada de ese tipo. No es el .mm
que causa fricción con .cpp
, es el .h
encabezado 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 .
...Bridging-Header.h
: expones C , Objective-C y Objective-C++ a Swift usando este puente<ProductModuleName>-Swift.h
: expone automáticamente tus clases Swift@objc
marcadas con Objective-C.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.h
no contiene una sola palabra clave de C++ , comoclass
, se puede agregar a...Bridging-Header.h
y 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 :
.swift
: no puedes mezclar Swift con nada.m
: puedes mezclar Objective-C con C . ( @Vinzzz ).mm
: puedes mezclar Objective-C con C++ . Este puente es Objective-C++ . ( @Vinzzz )..c
: C pura.cpp
: puedes mezclar C++ y ensamblador ( @Vality ).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.
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 .swift
archivo.
"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++.