EhT*_*hTd 128 c++ objective-c swift
我刚刚将.m文件更改为.mm并使用C++.有没有办法用Swift做同样的事情?
Swi*_*ect 161
这种混淆可能来自这样的假设,即只需.m要将文件扩展名从中更改.mm为桥接语言所需的全部内容,而实际上它并不是那种类型.它不会.mm引起摩擦.cpp,它是.h必须不是C++标题的标题.
在同一个项目中,您可以愉快地混合使用C,C++,Objective-C,Objective C++,Swift甚至Assembly.
...Bridging-Header.h:使用此桥将C,Objective-C和Objective-C++公开给Swift<ProductModuleName>-Swift.h:暴露自动您斯威夫特标有类@objc于Objective-C的.h:这是一个棘手的部分,因为它们被模糊地用于所有C,++或不同的目标,不管目标与否.当a .h不包含单个C++关键字时,class可以将其添加到...Bridging-Header.h,并将公开其声明的相应.c 或 .cpp功能的任何函数.否则,该标头必须包装在纯C或Objective-C API中.在同一个文件中,你不能混合所有5.在同一个源文件中:
.swift:你不能把Swift和任何东西混在一起.m:你可以将Objective-C与C混合使用.(@Vinzzz).mm:您可以将Objective-C与C++混合使用.这个桥是Objective-C++.(@Vinzzz)..c:纯C.cpp:你可以混合C++和汇编(@Vality).h:无处不在,含糊不清的C,C++,Objective-C或Objective-C++,所以答案取决于它.参考
Rob*_*ier 110
不.当你从.m切换到.mm时,你实际上是从Objective-C切换到另一种叫做Objective-C++的语言(有很多细微差别).所以你并没有真正使用C++; 您正在使用Objective-C++,它接受大多数C++作为输入(与C++接受大多数但不是所有C作为输入的方式相同).当我说它不是C++时,考虑一个包含一个名为nil(这是合法的C++)的变量的C++文件,然后尝试将其编译为Objective-C++.
斯威夫特没有相同的关系.它不是C或C++的超集,也不能直接在.swift文件中使用.
"将Swift与Cocoa和Objective-C一起使用"也告诉我们:
您无法直接将C++代码导入Swift.相反,为C++代码创建一个Objective-C或C包装器.
小智 72
我写了一个简单的Xcode 6项目,展示了如何混合使用C++,Objective C和Swift代码:
https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console
特别是该示例从Swift调用Objective C和C++函数.
关键是创建一个共享头Project-Bridging-Header.h并将Objective C头放在那里.
请下载该项目作为完整示例.
fou*_*dry 27
我刚刚使用Swift,Objective-C和C++制作了一个示例项目.这是一个如何在iOS中使用OpenCV拼接的演示.OpenCV API是C++,所以我们不能直接从Swift中与它交谈.我使用一个小包装类,它的实现文件是Objective-C++.该头文件是干净的Objective-C,所以雨燕进行直接通话这一点.您必须注意不要将任何C++ - ish文件间接导入Swift与之交互的标头中.
该项目在这里:https://github.com/foundry/OpenCVSwiftStitch
Dan*_*n G 26
您还可以跳过其间的Objective-C文件.只需添加一个带有.cpp源文件的C头文件.头文件中只有C声明,并在源文件中包含任何C++代码.然后在** - Bridging-Header.h中包含C头文件.
下面的示例返回一个指向C++对象(struct Foo)的指针,因此Swift可以存储在COpaquePointer中,而不是在全局空间中定义struct Foo.
Foo.h文件(由Swift看到 - 包含在桥接文件中)
#ifndef FOO_H
#define FOO_H
// Strictly C code here.
// 'struct Foo' is opaque (the compiler has no info about it except that 
// it's a struct we store addresses (pointers) to it.
struct Foo* foo_create();
void foo_destroy(struct Foo* foo);
#endif
内部源文件Foo.cpp(Swift看不到):
extern "C"
{
#include "Foo.h"
}
#include <vector>
using namespace std;
// C++ code is fine here. Can add methods, constructors, destructors, C++ data members, etc.
struct Foo
{
   vector<int> data;
};
struct Foo* foo_create()
{
   return new Foo;
}
void foo_destroy(struct Foo* foo)
{
    delete foo;
}
小智 13
这是我尝试使用clang工具自动化C++/swift通信.您可以从swift实例化C++类,从C++类继承,甚至可以在swift中覆盖虚方法.
它将解析您要导出到swift的C++类并自动生成Objective-C/Objective-C++桥.
https://github.com/sandym/swiftpp
| 归档时间: | 
 | 
| 查看次数: | 84777 次 | 
| 最近记录: |