online objective convert c++ objective-c c swift bridging-header

c++ - convert - swift to objective c online



¿Puedo tener archivos Swift, Objective-C, C y C++ en el mismo proyecto Xcode? (1)

¿Se pueden usar los 4 idiomas en el mismo proyecto? De ser así, ¿cómo?

Hay preguntas similares en el sabor: ¿Puedo mezclar Swift con C ++? Al igual que el objetivo: archivos C .mm para los que la respuesta aceptada es no .

Usando el Bridging Header adecuadamente, .h que no contiene sentencias C++ , contenedores Objective-C cuando .h contienen archivos C++ , .mm para hacer el .mm real de las clases C++ y .swift , pueden los 4 idiomas (5 si incluye Objective-C++ ) construir y vincular en un solo ejecutable?

Objective-c ++ xcode


SI.

Puede mezclar archivos Swift , C , C++ , Objective-C y Objective-C++ en el mismo proyecto Xcode.

C

// Declaration: C.h #ifndef C_h #define C_h #ifdef __cplusplus extern "C" { #endif void hello_c(const char * name); #ifdef __cplusplus } #endif #endif /* C_h */ // Definition: C.c #include "C.h" #include <stdio.h> void hello_c(const char * name) { printf("Hello %s in C/n", name); }

C ++

// Declaration: CPP.hpp #pragma once #include <string> class CPP { public: void hello_cpp(const std::string& name); }; // Definition: CPP.cpp #include "CPP.hpp" #include <iostream> using namespace std; void CPP::hello_cpp(const std::string& name) { cout << "Hello " << name << " in C++" << endl; }

Objective-C wrapper para C ++

// Declaration: CPP-Wrapper.h #import <Foundation/Foundation.h> @interface CPP_Wrapper : NSObject - (void)hello_cpp_wrapped:(NSString *)name; @end // Definition: CPP-Wrapper.mm #import "CPP-Wrapper.h" #include "CPP.hpp" @implementation CPP_Wrapper - (void)hello_cpp_wrapped:(NSString *)name { CPP cpp; cpp.hello_cpp([name cStringUsingEncoding:NSUTF8StringEncoding]); } @end

C objetivo

// Declaration: Objective-C.h #import <Foundation/Foundation.h> @interface Objective_C : NSObject - (void)hello_objectiveC:(NSString *)name; @end // Definition: Objective-C.m #import "Objective-C.h" @implementation Objective_C - (void)hello_objectiveC:(NSString*)name { printf("Hello %s in Objective-C/n", [name cStringUsingEncoding:NSUTF8StringEncoding]); } @end

Objetivo-C ++

// Declaration: Objective-CPP.h #import <Foundation/Foundation.h> @interface Objective_CPP : NSObject - (void)hello_objectiveCpp:(NSString *)name; @end // Definition: Objective-CPP.mm #include <iostream> #import "Objective-CPP.h" using namespace std; @implementation Objective_CPP - (void)hello_objectiveCpp:(NSString *)name { cout << "Hello " << [name cStringUsingEncoding:NSUTF8StringEncoding] << " in Objective-C++/n"; } @end

Rápido

// Declaration & definition: Swift.swift func hello_swift(_ name: String) { print("Hello /(name) in Swift") }

Bridging-Header.h

No se puede importar el archivo de encabezado CPP.hpp , no por su convención de nomenclatura, sino porque contiene la palabra clave de class .

#import "C.h" #import "CPP-Wrapper.h" #import "Objective-C.h" #import "Objective-CPP.h"

Invocación de Swift

// Invoke C hello_c("World".cStringUsingEncoding(NSUTF8StringEncoding)) // Can''t Invoke C++ without a wrapper // CPP().hello_cpp("World".cStringUsingEncoding(NSUTF8StringEncoding)) // Invoke C++ through Objective-C CPP_Wrapper().hello_cpp_wrapped("World") // Invoke Objective-C Objective_C().hello_objectiveC("World") // Invoke Objective-C++ Objective_CPP().hello_objectiveCpp("World") // Invoke Swift Swift().hello_swift("World")

.h (encabezados)

(Consulte el elemento 3 en esta respuesta de desbordamiento de pila )

.h: esta es la parte difícil, ya que se usan de manera ambigua para todos los sabores de C, ++ o no, objetivo o no. Cuando un .h no contiene una sola palabra clave de C ++, como class, se puede agregar a ... Bridging-Header.h, y expondrá cualquier función que corresponda a las funcionalidades .c o .cpp que declara. De lo contrario, ese encabezado debe estar envuelto en una API pura de C o Objective-C.

Salida

Hello World in C Hello World in C++ Hello World in Objective-C Hello World in Objective-C++ Hello World in Swift

Comentarios

Cy-4AH :

Si. Solo necesita envolver C++ en C u Objective-C para usar en Swift .

Tommy

De hecho, tengo un proyecto que hace exactamente eso. C++ para el impulso del modelo abstracto multiplataforma con algunas partes C debajo; Objective-C para envolver las clases de C++ para propósitos de Swift , Swift para vincular todo eso a una subclase de NSDocument , con algunas vistas personalizadas que interrogan las cosas de C

MaddTheSane

Se agregó el envoltorio extern "C" según su excelente sugerencia. Para invocar el método C void hello_c(const char * name) desde el método C ++ hello_cpp(const std::string& name) , agregue #include "Ch" y llame a hello_c(name.c_str()); .

Keith Adler

El nuevo SO-32541268 : ¡Ahora con parámetros!

► Encuentre esta solución en GitHub y detalles adicionales sobre SO-32541268 .