回答:
いいえ。.mから.mmに切り替えると、実際にはObjective-CからObjective-C ++と呼ばれる別の言語(微妙な違いが多い)に切り替わります。つまり、実際にはC ++を使用していません。ほとんどのC ++を入力として受け入れるObjective-C ++を使用しています(C ++がすべてではないがほとんどのCを入力として受け入れるのと同じ方法で)。それが完全なC ++ではないと言うときは、nil
(正当なC ++である)という名前の変数を含むC ++ファイルを検討し、それをObjective-C ++としてコンパイルしてみます。
Swiftと同じ関係はありません。CやC ++のスーパーセットではないため、.swift
ファイルで直接使用することはできません。
「CocoaとObjective-CでSwiftを使用する」とは、
C ++コードをSwiftに直接インポートすることはできません。代わりに、C ++コード用のObjective-CまたはCラッパーを作成します。
.mm
使用すると、ファイルにアクセスして(ほぼ)作業を完了できます。Swiftではそうではありません。
nil
ような変数を意味すると思いますint nil
混乱は、ファイル拡張子をから.m
に変更するだけで.mm
言語を埋める必要があるという仮定から発生する可能性がありますが、実際には、そのようなことは何も行いません。との.mm
摩擦を引き起こすの.cpp
は.h
ヘッダーではなく、ヘッダーであってはならないことC++
です。
では、同じプロジェクトで、あなたは喜んで混在させることができますC、C ++、Objective-Cの、客観C ++、スウィフトをしても、およびアセンブリ。
...Bridging-Header.h
:このブリッジを使用して、C、Objective-C、およびObjective-C ++をSwiftに公開します<ProductModuleName>-Swift.h
:公開して、自動的にあなたのスウィフトの付いたクラス@objc
へのObjective-Cを.h
:これはトリッキーな部分です。これは、C、++、またはObjectiveかどうかのすべてのフレーバーにあいまいに使用されているためです。にのような.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 ++なので、答えはそれによって異なります。参考文献
C ++、Objective C、Swiftコードを混合する方法を示す簡単なXcode 6プロジェクトを作成しました。
https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console
特に、この例では、SwiftからObjective CおよびC ++関数を呼び出します。
重要なのは、共有ヘッダーProject-Bridging-Header.hを作成し、そこにObjective Cヘッダーを配置することです。
完全な例としてプロジェクトをダウンロードしてください。
ObjCtoCPlusPlus.h
/ `` .mm`は、C ++コードへのOb-Cインターフェースを提供することのみを目的として存在します。これは、ここで必要なコンポーネントであるブリッジです。インクルードはそのままにして、ObjCtoCPlusPlus.…
アクセスする必要がある各C ++メソッドのファイルにメソッドを追加します。あなたは以上の読み取りにうまくやっ思いsourcemaking.com/design_patterns/adapterを
間にあるObjective-Cファイルをスキップすることもできます。Cヘッダーファイルと.cppソースファイルを追加するだけです。ヘッダーファイルにはC宣言のみを記述し、ソースファイルにはC ++コードを含めます。次に、Cヘッダーファイルを**-Bridging-Header.hに含めます。
次の例では、C ++オブジェクト(構造体Foo)へのポインターを返すため、Swiftは、構造体Fooをグローバルスペースで定義する代わりにCOpaquePointerに格納できます。
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;
}
extern "C"
なく、インクルードされる場所でヘッダーをラップするのを見たのはこれが初めて#ifdef
です。鮮やかさ!
私はSwift、Objective-C、C ++を使用して小さなサンプルプロジェクトを作成しました。これは、iOSでOpenCVスティッチングを使用する方法のデモです。OpenCV APIはC ++なので、Swiftから直接話すことはできません。私は実装ファイルがObjective-C ++である小さなラッパークラスを使用しています。ヘッダスウィフトが直接これに話すことができるように、ファイルには、Objective-Cのクリーンです。C ++風のファイルをSwiftが対話するヘッダーに間接的にインポートしないように注意する必要があります。
プロジェクトはここにあります:https : //github.com/foundry/OpenCVSwiftStitch
C ++ / swift通信を自動化するclangツールの私の試みは次のとおりです。C ++クラスをSwiftからインスタンス化し、C ++クラスから継承し、Swiftの仮想メソッドをオーバーライドすることもできます。
エクスポートするC ++クラスを迅速に解析し、Objective-C / Objective-C ++ブリッジを自動的に生成します。
SwiftはC ++と直接互換性がありません。C ++コードをObjective-Cでラップし、SwiftでObjective Cラッパーを使用することで、この問題を回避できます。
また、opencvをすばやく組み合わせるためのデモプログラムもあります。
https://github.com/russj/swift_opencv3_demoからダウンロードできます。
デモの詳細についてはhttp://flopalm.com/opencv-with-swift/をご覧ください。
いいえ、単一のファイルではありません。
ただし、静的ライブラリやフレームワークを必要とせずに、SwiftプロジェクトでC ++を使用できます。他の人が言ったように、重要なのは、CとしてマークされているC互換のC ++ヘッダーを#includeするObjective-Cブリッジヘッダーを、extern "C" {}トリックと互換性のあるものにすることです。
ビデオチュートリアル:https : //www.youtube.com/watch?v=0x6JbiphNS4
他の答えは少し不正確です。実際には、Swiftと[Objective-] C [++]の両方を同じファイルに混在させることができますが、期待どおりにはいきません。
このファイル(c.swift)は、swiftc c.swift
とclang -x objective-c c.swift
/* /* */
#if 0
// */
import Foundation
print("Hello from Swift!")
/* /* */
#endif
#include <stdio.h>
int main()
{
puts("Hello from C!");
return 0;
}
// */
(多くの)1つのトリックは
@interfaceと@implementationを同じ.mmファイルに単にスローすることはできません。
したがって、ブリッジングヘッダーファイルには
#import "Linkage.hpp"
Linkage.hppにはLinkageの@インターフェイスがあり、Linkage.mmには.mmの@implementationがあります。
その後
#include "yourCpp.hpp"
Linkage.mmファイルのみを入れ、Linkage.hppファイルは入れません。
多くのオンラインの例/チュートリアルでは、ライターは@interfaceと@implementationを同じ.mmファイルに配置するだけです。
これは非常に単純なcppブリッジングの例で機能しますが、
問題は:
yourCpp.hppにc ++の機能がまったくある場合(最初の行など#include <something>
)、プロセスは失敗します。
しかし、あなただけの場合はありません持って#include "yourCpp.hpp"
リンケージにヘッダ(.mmファイルでそれを持っていることの罰金、明らかにあなたがする必要があります)ファイル-それは動作します。
繰り返しになりますが、これは残念ながらプロセス全体の1つのヒントにすぎません。
これがだれにも役立つ場合に備えて、簡単なC ++静的ライブラリを簡単なSwiftコマンドラインユーティリティから呼び出す簡単なチュートリアルもあります。これは本当に必要最低限の概念実証コードです。
Objective-Cは関係なく、SwiftとC ++のみです。C ++ライブラリのコードは、extern "C"リンケージを持つ関数を実装するC ++ラッパーによって呼び出されます。次に、その関数はブリッジヘッダーで参照され、Swiftから呼び出されます。
http://www.swiftprogrammer.info/swift_call_cpp.htmlを参照してください
SE-0038へのリンクを公式リソースに提供しています。 これは、Swiftプログラミング言語の変更とユーザーに表示される拡張機能の提案を維持するためです。
今日のステータスは、これは受け入れられたがまだスケジュールされていない機能リクエストであるということです。
このリンクは、この機能を探している人を正しい方向に導くためのものです