可以在同一项目中完全使用所有4种语言吗?
这个风格也有类似的问题:我可以将Swift与C ++混合使用吗?类似于
Objective-C .mm文件,对于该文件,可接受的答案
为否。
Bridging Header适当地使用.h不包含C
语句的语句,
Objective-C何时.h包含的包装器C
,.mm用于
实际包装C
类的文件以及.swift,这4种语言(如果
包含,则为5种Objective-C
)能否构建并链接到单个可执行文件中?
您可以混合使用Swift
,C
,C++
,Objective-C
和Objective-C++
中的文件相同的Xcode
项目。
// 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);
}
// 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;
}
// 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
// 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")
}
Cannot importCPP.hpp
header file, not because of it’s naming convention,
but because it contains the class
keyword.
#import "C.h"
#import "CPP-Wrapper.h"
#import "Objective-C.h"
#import "Objective-CPP.h"
// 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")
(See item 3 in this Stack Overflow
answer)
.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
Comments
Cy-4AH :
Yes. You only need wrap C++
into C
or Objective-C
to use in Swift
.
Tommy
Indeed, I have a project that does exactly that. C++
for the thrust of the
abstract cross-platform model stuff with some C
parts underneath;
Objective-C
to wrap the C++
classes for Swift
purposes, Swift
to bind
all that to a subclass of NSDocument
, with some custom views that
interrogate the C
stuff.
MaddTheSane
Added the extern "C"
wrapper as per your excellent suggestion. To invoke the
C method void hello_c(const char * name)
from C++ method
hello_cpp(const std::string& name)
, add #include "C.h"
and call
hello_c(name.c_str());
.
Keith Adler
The newSO-32541268: Now
with parameters!
► Find this solution on
GitHub and additional details
on Swift Recipes.
我们可以在同一个xcode项目中同时使用swift(.swft)和objective c(.h.m)吗?
问题内容: 我只是将.m文件更改为.mm并使用C ++。有没有办法用Swift做同样的事情? 问题答案: 不。当您从.m切换到.mm时,您实际上是在从Objective-C切换到另一种称为Objective-C 的语言。因此,您并不是真正在使用C 。您使用的是Objective-C ,它接受大多数C 作为输入(与C 接受大多数但不是全部C作为输入的方式相同)。当我说它不是完全C 时,请考虑一个C
本文向大家介绍如何在C#中订阅事件,我们可以在C#中为一个事件拥有多个订阅者吗?,包括了如何在C#中订阅事件,我们可以在C#中为一个事件拥有多个订阅者吗?的使用技巧和注意事项,需要的朋友参考一下 事件使类或对象在发生感兴趣的事件时通知其他类或对象。 引发事件的类称为发布者,而处理事件的类称为订阅者。 在事件中 一个事件可以有多个订阅者。订阅者可以处理来自多个发布者的多个事件。 没有订阅者的事件永远
问题内容: 有什么方法可以在我的Swift项目中使用swift使用用Objective-C编写的CocoaPod吗? 我只是制作桥接头吗?如果可以,我可以在Swift中访问CocoaPod中的库定义的对象,类和字段吗? 问题答案: 您问题的基本答案是,可以,您可以使用CocoaPods构建的Objective-C代码。 更重要的问题是“如何使用此类库?” 这个问题的答案取决于您中的标志: 假设您要
我领导的应用程序有一个相当大的代码库(70.000行),所以一次过渡它是不可能的。
问题内容: 我将swift框架导入到Objective-C项目中,如下所示: 问题在于我正在导入框架的类只能识别某些类。 被认可的课程: 该类不是: 它们都是公开的,那么为什么第一个在工作空间中被识别,而另一个却没有? 我也在头文件MyFramework-Swift.h中看到一个类 出现而其他不出现 这是为什么? 另外要指出的是,当我将swift框架导入swift项目时,该相同的程序也可以工作 问