我可以在同一个 Xcode 项目中包含 Swift、Objective-C、C 和 C++ 文件吗?
Can I have Swift, Objective-C, C and C++ files in the same Xcode project?
是否可以在同一个项目中使用所有 4 种语言,如果可以的话如何?
风味中有 相似 个问题:Can I mix Swift with C++? Like the Objective - C .mm files 已接受的答案是 否。
充分使用 Bridging Header
,.h
不包含 C++
语句,Objective-C
包装器 .h
包含 C++
,.mm
文件来完成 C++
类 和 .swift
的实际包装,可以构建 4 种语言(如果包含 Objective-C++
则为 5 种语言)和 link 到单个可执行文件中?
是的。
您可以将 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
Objective-C
// 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
Objective-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
Swift
// Declaration & definition: Swift.swift
func hello_swift(_ name: String) {
print("Hello \(name) in Swift")
}
Bridging-Header.h
无法导入 CPP.hpp
header 文件,不是因为它的命名约定,而是因为它包含 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")
.h (Headers)
(参见 this Stack Overflow answer 中的 项 3)
.h: this is the tricky part, since they are ambiguously used for all flavors of C, ++ or not, Objective or not. When a .h does not contain a single C++ keyword, like class, it can be added to the ...Bridging-Header.h, and will expose whatever function the corresponding .c or .cpp functionalities it declares. Otherwise, that header must be wrapped in either a pure C or 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++
抽象 cross-platform 模型的主旨,下面有一些 C
部分; Objective-C
包装 C++
类 用于 Swift
目的,Swift
将所有内容绑定到 NSDocument
的子类,并带有一些自定义视图审问 C
的东西。
根据您的出色建议添加了 extern "C"
包装器。要从 C 方法 hello_cpp(const std::string& name)
调用 C 方法 void hello_c(const char * name)
,请添加 #include "C.h"
并调用 hello_c(name.c_str());
.
新增SO-32541268:现在带参数!
► 在 GitHub and additional details on Swift Recipes 上找到此解决方案。
是否可以在同一个项目中使用所有 4 种语言,如果可以的话如何?
风味中有 相似 个问题:Can I mix Swift with C++? Like the Objective - C .mm files 已接受的答案是 否。
充分使用 Bridging Header
,.h
不包含 C++
语句,Objective-C
包装器 .h
包含 C++
,.mm
文件来完成 C++
类 和 .swift
的实际包装,可以构建 4 种语言(如果包含 Objective-C++
则为 5 种语言)和 link 到单个可执行文件中?
是的。
您可以将 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
Objective-C
// 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
Objective-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
Swift
// Declaration & definition: Swift.swift
func hello_swift(_ name: String) {
print("Hello \(name) in Swift")
}
Bridging-Header.h
无法导入 CPP.hpp
header 文件,不是因为它的命名约定,而是因为它包含 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")
.h (Headers)
(参见 this Stack Overflow answer 中的 项 3)
.h: this is the tricky part, since they are ambiguously used for all flavors of C, ++ or not, Objective or not. When a .h does not contain a single C++ keyword, like class, it can be added to the ...Bridging-Header.h, and will expose whatever function the corresponding .c or .cpp functionalities it declares. Otherwise, that header must be wrapped in either a pure C or 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++
抽象 cross-platform 模型的主旨,下面有一些 C
部分; Objective-C
包装 C++
类 用于 Swift
目的,Swift
将所有内容绑定到 NSDocument
的子类,并带有一些自定义视图审问 C
的东西。
根据您的出色建议添加了 extern "C"
包装器。要从 C 方法 hello_cpp(const std::string& name)
调用 C 方法 void hello_c(const char * name)
,请添加 #include "C.h"
并调用 hello_c(name.c_str());
.
新增SO-32541268:现在带参数!
► 在 GitHub and additional details on Swift Recipes 上找到此解决方案。