我可以在同一个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

One Solution collect form web for “我可以在同一个Xcode项目中使用Swift,Objective-C,C和C ++文件吗?”

是。

您可以在同一个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的更多细节。

  • Swift中的CLLocation Manager获取用户的位置
  • 在Swift中设置一个NSManagedObject关系
  • 什么是快速代码执行的入口点?
  • 从父iOS访问容器视图控制器
  • 创build一个扩展来从Swift中的数组中过滤nils
  • 在Xcode 6中有一个快捷键在光标下运行一个当前的testing函数吗?
  • Swift和mutating结构
  • 在iOS 7 +中的Base64解码
  • 具有透明背景的Swift模态视图控制器
  • 为什么在一个协议中只能得到一个只能得到的属性需求才能被一个符合的属性满足?
  • 从应用程序委托使用swift打开视图控制器