Могу ли я иметь файлы Swift, Objective-C, C и C++ в одном проекте Xcode?
можно ли вообще использовать все 4 языка в одном проекте, и если да, то как?
здесь как вопросы в аромате: можно ли смешать Swift с C++? Как и цель-С. mm files на который принимается ответ нет.
используя Bridging Header
надлежащим образом, .h
, которые не содержат C++
отчетность, Objective-C
фантики, когда .h
содержат C++
, .mm
файлы, чтобы сделать фактическую обертку C++
занятия, и .swift
, могут 4 языка (5 Если вы включаете Objective-C++
) построить и связать в один исполняемый файл?
1 ответов
да.
вы можете смешивать Swift
, C
, C++
, Objective-C
& Objective-C++
файлы в том же проекте 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 оболочка для 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
С
// 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
Цель-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
Свифт
// Declaration & definition: Swift.swift
func hello_swift(_ name: String) {
print("Hello \(name) in Swift")
}
Преодоление-Заголовка.h
не удается импортировать CPP.hpp
заголовок файла, не из-за этого соглашение об именах, но потому что оно содержит class
ключевое слово.
#import "C.h"
#import "CPP-Wrapper.h"
#import "Objective-C.h"
#import "Objective-CPP.h"
вызов от 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")
.ч (заголовки)
(см. пункт 3 на этот ответ переполнения стека)
.h: это сложная часть, так как они двусмысленно используются для всех вкусов C, ++ или нет, объективных или нет. Когда .h не содержит ни одного ключевого слова C++, например class, это может быть добавлено ...Мост-Заголовок.h, и выставит любую соответствующую функцию .C или .cpp функциональные возможности он объявляет. В противном случае этот заголовок должен быть обернут в чистый C или Objective-C API.
выход
Hello World in C
Hello World in C++
Hello World in Objective-C
Hello World in Objective-C++
Hello World in Swift
комментарии
да. Вам нужно только обернуть C++
на C
или Objective-C
для использования в Swift
.
действительно, у меня есть проект, который делает именно это. C++
для тяги абстрактной кросс-платформенной модели с некоторыми C
запасные части внизу; Objective-C
чтобы обернуть C++
классы Swift
целей Swift
привязать все это к подклассу NSDocument
, С некоторыми пользовательскими представлениями, которые опрашивают C
материал.
добавил extern "C"
wrapper согласно вашему превосходному предложению. Чтобы вызвать C метод void hello_c(const char * name)
С C++ метод hello_cpp(const std::string& name)
добавьте #include "C.h"
и звонок hello_c(name.c_str());
.
на новая SO-32541268: теперь с параметрами!
► найти это решение на GitHub и дополнительные сведения о Swift Рецепты.