12

NSString で case ステートメントを使用したい コードを正しいコードに変更してください

NSString *day = @"Wed";

switch (day) {
    case @"Sat":
        NSlog(@"Somthing...");
        break;

    case @"Sun":
        NSlog(@"Somthing else...");
        break;  
        .
        .
        .
        .

    default:
        break;
}
4

2 に答える 2

55

条件の長いリストよりも少しスマートなディスパッチが必要な場合は、ブロックの辞書を使用できます。

NSString *key = @"foo";

void (^selectedCase)() = @{
    @"foo" : ^{
        NSLog(@"foo");
    },
    @"bar" : ^{
        NSLog(@"bar");
    },
    @"baz" : ^{
        NSLog(@"baz");
    },
}[key];

if (selectedCase != nil)
    selectedCase();

ケースの非常に長いリストがあり、これを頻繁に行う場合、パフォーマンスがわずかに向上する可能性があります。次に、辞書をキャッシュする必要があります (ブロックをコピーすることを忘れないでください)。

利便性と簡潔さのために読みやすさを犠牲にして、すべてを 1 つのステートメントに収め、デフォルトのケースを追加するバージョンを次に示します。

((void (^)())@{
    @"foo" : ^{
        NSLog(@"foo");
    },
    @"bar" : ^{
        NSLog(@"bar");
    },
    @"baz" : ^{
        NSLog(@"baz");
    },
}[key] ?: ^{
    NSLog(@"default");
})();

私は前者の方が好きです。

于 2013-09-28T14:17:38.897 に答える
2

Switchステートメントは NSString では機能せず、整数のみで機能します。使用if else:

NSString *day = @"Wed";

if([day isEqualToString:@"Sat"]) {
        NSlog(@"Somthing...");
       }
else if([day isEqualToString:@"Sun"]) {
        NSlog(@"Somthing...");
       }
...
于 2013-09-28T14:14:35.817 に答える