7

Obj-C では、スイッチは数値のみを評価できます。たとえば、次のようなオブジェクトのクラスを比較するために使用できるようにしたいと思います。

switch (currentSubViewController.class) 
{
     case UITableViewController.class :
          <do stuff>
          break;
     case UICollectionViewController.class :
          <do stuff>
          break;
}

これを達成する方法はありますか?さまざまなケースで読みやすくなり、将来いつでもケースを追加できるので、スイッチを使用できるようにしたいと本当に思っています。何か案は?

4

5 に答える 5

1

このswitchステートメントは、整数型でのみ機能します。if-else大きなブロックが必要です。

本当にステートメントを強制したい場合はswitch、クラスの固定配列を使用して何かを解決し、チェックしているクラスのインデックス位置のスイッチをオフにすることができます。ただし、case ステートメントを読みやすくするために、各クラスのインデックス位置を表す一連の定数を定義する必要があります。if-elseこれは、回避してブロックするためだけに維持するための多くの作業とコードです。

于 2013-05-19T23:30:42.300 に答える
0

それは可能ではありません。if-elseifこのようなステートメントを使用する必要があります

if ([currentSubViewController isMembefOrClass:[UITableViewController class]]) 
{
    <do stuff>
} else if ([currentSubViewController isMemberOfClass:[UICollectionViewController class]]) {

}

を使用して、どのステートメントが実行されるisMemberOfClass:かをシミュレートしていることに注意してください。switch-caseしかし、ほとんどの場合、使用したいisKindOfClass:

于 2013-05-19T23:30:35.373 に答える
0

1 つの方法は、関心のあるクラスを .xml 内の値にマッピングするデータ構造を構築することですenum。これは多くの定型コードになります。

残念ながら、Objective-C にはswitch、Ruby などの言語のようなオブジェクト指向の条件付き言語はありません。Cswitchステートメントのみがあります。caseCステートメントの Aにswitchは整数定数が必要であり、これが Cswitchステートメントを使用したより動的なアプローチを妨げるものです。C 列挙型は、定数でも機能します。これは、どちらも実行時に生成できないことを意味しますが、コンパイル時に生成される可能性があります。

C enum と switch ステートメントはうまく連携しますが、オブジェクトに対してはそれほどホットではありません。

if-elseしたがって、ここで比較を行うには、複合ステートメントを使用する方がよい場合があります。

于 2013-05-20T01:24:16.580 に答える
0

辞書リテラルを使用できます。

((void(^)())@{
NSStringFromClass([UITableViewController class]) : [^{
    // stuff
} copy],
NSStringFromClass([UICollectionViewController class]) : [^{
    // stuff
} copy]
}[NSStringFromClass([currentSubViewController class])])();

注: これは単なる楽しみです。深刻な提案として受け取らないでください。

@AramKocharyanの回答を真剣に使用してください。

于 2013-05-19T23:50:20.663 に答える