我可以在同一个Xcode项目中使用Swift,Objective-C,C和C ++文件吗?

所有4种语言都可以用在同一个项目中,如果是这样的话?

在风格上也有类似的问题: 我可以混合使用Swift和C ++吗? 就像接受答案不是 的Objective – C .mm文件一样 。

充分使用Bridging Header ,不包含C++语句的.h ,当.h包含C++ .mm文件来包装C++类和.swift时, Objective-C包装器可以包含4种语言(如果包含5种语言Objective-C++ )构build并链接到一个单一的可执行文件?


objective-c ++ xcode

是。

您可以在同一个Xcode项目中混合使用SwiftCC++Objective-CObjective-C++文件。

C

 // Declaration: Ch #ifndef C_h #define C_h #ifdef __cplusplus extern "C" { #endif void hello_c(const char * name); #ifdef __cplusplus } #endif #endif /* C_h */ // Definition: Cc #include "Ch" #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; } 

用于C ++的Objective-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 

Objective-C的

 // Declaration: Objective-Ch #import <Foundation/Foundation.h> @interface Objective_C : NSObject - (void)hello_objectiveC:(NSString *)name; @end // Definition: Objective-Cm #import "Objective-Ch" @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") } 

转职Header.h

不能导入CPP.hpp头文件,不是因为它的命名约定,而是因为它包含class关键字。

 #import "Ch" #import "CPP-Wrapper.h" #import "Objective-Ch" #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") 

.h(标题)

(参见Stack Overflow答案中的第 3项

.h:这是一个棘手的部分,因为它们被模糊地用于所有types的C,++或不是,目标与否。 当.h不包含单个C ++关键字时,如类,它可以被添加到… Bridging-Header.h,并将公开任何函数声明相应的.c或.cppfunction。 否则,该头文件必须封装在纯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 

注释

Cy-4AH

是。 您只需要将C++包装到CObjective-C以在Swift使用。

汤米

事实上,我有一个完全一样的项目。 C++用于抽象的跨平台模型的东西,下面有一些C部分; Objective-C为了Swift目的来包装C++类, Swift把所有的东西都绑定到NSDocument的子类上,还有一些自定义的视图来查询C东西。

MaddTheSane

根据您的出色build议添加extern "C"包装。 从C ++方法hello_cpp(const std::string& name)调用C方法void hello_c(const char * name) hello_cpp(const std::string& name) ,添加#include "Ch"并调用hello_c(name.c_str());

基思阿德勒

新的SO-32541268 :现在带参数!


►在GitHub上find这个解决scheme和Swift Recipes的更多细节。

Interesting Posts