0

疑似コードでいくつかのメソッドを作成しましたが、目的の C メソッドを作成したいと考えています。それを定義するのを手伝ってもらえますか? 私は Objective C にあまり詳しくないので、混乱しています。また、メソッドのパラメーターとして文字列を使用したいのですが、NSString オブジェクトは使用したくありません。

これがメソッド定義です。目的の C 定義に適合するかどうかはわかりません。また、「文字列」型についてもわかりません。

-(BOOL) testMethod(string largestring, string smallstring) {
    return true;
}

また、文字列型を使用できるようにライブラリを含める必要がありますか? ありがとう。

4

4 に答える 4

3

ここに複数の方法があります:

  1. C++ コードでは、C で C++ メソッドのラッパー関数を提供しますextern "C"
  2. Objective-C コードに.mm拡張子 (つまり、Objective-C++) を付けて、C++ を直接呼び出します。

いくつかの制限があります:

  • Objective-C は C++ の例外をキャッチできず、以前のバージョンでは C++ も Objective-C の例外をキャッチできませんでした。
  • 以前のバージョンでは、オブジェクトが解放されたときに C++ デストラクタは呼び出されませんでした。で手動で行う必要があります-(void) dealloc
  • C++ オブジェクトを Objective-C コンテナーに入れることはできません。

そして良い点:

  • Objective-C++ コードでは、C++11 ラムダ式と Objective-C ブロックを混在させることができます。clang 3.3 では、それらは交換可能です。
于 2013-06-08T09:44:20.380 に答える
1

文字列をパラメーターとして使用したいと言ったので、Cスタイルchar*ではなく、ある種の文字列クラスが必要だと思います。他に何も指定しなかったので、私の例でstd::stringは C++ 標準ライブラリから使用しています。

これは、メソッドが Objective-C 構文でどのように見えるかです。

#import <string>

- (BOOL) testMethodWithLargeString:(const std::string&)largeString smallString:(const std::string&)smallString
{
  return YES;
}

いくつかのメモ:

  • これを機能させるには、これを拡張子 のファイルに配置する必要があります.mm。拡張子は、ファイルに C++ と Objective-C のコードが混在していることをコンパイラに伝えます。
  • std::stringは C++ 標準ライブラリに由来しますが、プロジェクトをそのライブラリにリンクさせるために特別なことをする必要はないと思います。
  • BOOL戻り値の型として(大文字) または(小文字) のどちらを使用するかを決定する必要がありboolます。BOOLは従来の Objective-C ブール型boolですが、 は従来の C++ プリミティブ ブール型です。ではandを戻り値としてBOOL使用する必要がありますが、 では and を使用する必要があります。2 つの型とその値を混在させようとするべきではありません。コンパイラが満足することはありません (また、キャストを使用してコンパイラに混在を受け入れさせると、遅かれ早かれ満足できなくなります) YESNObooltruefalse
  • const std::string&パラメータのタイプとして固執するようにしてinください。を使用constすると、パラメーターの内容を誤って変更することを防ぐことができます。だけをstd::string&( なしでconst) 使用すると、パラメーターはパラメーターになりoutます。また、ポインター (const std::string*またはstd::string*)std::stringは値型であり (よくわからない場合はそのトピックを読んでください)、通常は参照と組み合わされるため、使用しないことをお勧めします。最後になりましたが、絶対使用しないでくださいstd::string(つまり、&[参照] または*[ポインター] なしで) - 使用すると、メソッドを呼び出すたびに文字列のコピーが作成されます。これらすべてのことをすでに知っている場合は、もちろん、私のアドバイスを無視してかまいません:-)
  • メソッドの命名に関する最後の言葉: メソッド名が「セクション」に分割されているのは、Objective-C の特性であり、各パラメーターに 1 つずつあります。これには、パラメーター名をメソッド名に組み込むことができるという利点があり、その結果、メソッドを呼び出すときに、コードがより表現力豊かになり、読みやすくなります。他の言語の同様の機能は、名前付きパラメーター (別名キーワード引数) です。

Maxthon Chan による回答には、C++ と Objective-C を混在させるときに考慮する必要があることについての役立つヒントもあります。

于 2013-06-08T11:33:39.520 に答える
1

あなたの方法はこのようにする必要があります

-(BOOL) testMethodWithLargeString:(NSString *)largestring smallString(NSString *)smallstring {
    return YES;
}

このメソッドにアクセスするには:

BOOL result = [<classObject> testMethodWithLargeString:string1 smallString:string2];

メソッドが自己クラスにある場合は、selfそれ以外の場合はオブジェクトまたはクラスを使用する必要があります。

また、複数のパラメーター化されたメソッドを記述する規則 (複数行に分割) :

BOOL result = [<classObject> testMethodWithLargeString:string1 
                                           smallString:string2];

また、文字列型を使用できるようにライブラリを含める必要がありますか?

いいえ、string.h のようなライブラリを使用する必要はありません

cocoa Foundation フレームワークには、これらすべてが含まれています。

于 2013-06-08T09:02:08.963 に答える
1

サンプルコード:

-(BOOL) testMethod :(NSString *)largestring :(NSString *)smallstring {
    return YES;
}

説明: Apple の資料を調べてください。

ここに画像の説明を入力

使用する : [self testMethod :yourLargeString :yourSmallString];


また、文字列型を使用できるようにライブラリを含める必要がありますか?

  • 回答 : いいえ。実際にNSString.hは内部で宣言されており、新しいフレームワークを作成するFoundation.frameworkXcode、既定でこのフレームワークがプロジェクトに追加されます ( Frameworksフォルダー内を確認してください)。したがって、そのライブラリを暗黙的に追加したため、特定のNSStringクラスを含める必要はありません。
于 2013-06-08T09:02:16.423 に答える