我可以在同一个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项目中混合使用Swift
, C
, C++
, Objective-C
和Objective-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++
包装到C
或Objective-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的更多细节。