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 .