[objective-c] Objective-C가 NSString을 전환 할 수 있습니까?

이것을 다시 쓰는 더 지능적인 방법이 있습니까?

if ([cardName isEqualToString:@"Six"]) {
    [self setValue:6];
} else if ([cardName isEqualToString:@"Seven"]) {
    [self setValue:7];
} else if ([cardName isEqualToString:@"Eight"]) {
    [self setValue:8];
} else if ([cardName isEqualToString:@"Nine"]) {
    [self setValue:9];
} 



답변

불행히도 그들은 할 수 없습니다. 이것은 스위치 문을 가장 잘 활용 한 것 중 하나이므로 (현재) Java (및 기타) 악 대차를 뛰어 넘을 수 있기를 바랍니다.

카드 이름을 사용하는 경우 각 카드 객체에 정수 값을 할당하고 켜십시오. 또는 숫자로 간주되어 전환 될 수있는 열거 형입니다.

예 :

typedef enum{
  Ace, Two, Three, Four, Five ... Jack, Queen, King

} CardType;

이 방법으로 완료하면 Ace는 사례 0과 같고 사례 1과 같이 2입니다.


답변

다음과 같이 블록 사전을 설정할 수 있습니다.

NSString *lookup = @"Hearts"; // The value you want to switch on

typedef void (^CaseBlock)();

// Squint and this looks like a proper switch!
NSDictionary *d = @{
    @"Diamonds":
    ^{
        NSLog(@"Riches!");
    },
    @"Hearts":
    ^{
        self.hearts++;
        NSLog(@"Hearts!");
    },
    @"Clubs":
    ^{
        NSLog(@"Late night coding > late night dancing");
    },
    @"Spades":
    ^{
        NSLog(@"I'm digging it");
    }
};

((CaseBlock)d[lookup])(); // invoke the correct block of code

‘기본’섹션을 가지려면 마지막 줄을 다음으로 바꾸십시오.

CaseBlock c = d[lookup];
if (c) c(); else { NSLog(@"Joker"); }

애플이 몇 가지 새로운 트릭을 ‘전환’할 수 있기를 바랍니다.


답변

나를 위해, 좋은 쉬운 방법 :

NSString *theString = @"item3";   // The one we want to switch on
NSArray *items = @[@"item1", @"item2", @"item3"];
int item = [items indexOfObject:theString];
switch (item) {
    case 0:
       // Item 1
       break;
    case 1:
       // Item 2
       break;
    case 2:
       // Item 3
       break;
    default:
       break;
}


답변

불행히도 switch 문은 기본 유형에만 사용할 수 있습니다. 그러나 컬렉션을 사용하는 몇 가지 옵션이 있습니다.

아마도 가장 좋은 옵션은 각 값을 NSDictionary의 항목으로 저장하는 것입니다.

NSDictionary *stringToNumber = [NSDictionary dictionaryWithObjectsAndKeys:
                                              [NSNumber numberWithInt:6],@"Six",
                                              [NSNumber numberWithInt:7],@"Seven",
                                              [NSNumber numberWithInt:8],@"Eight",
                                              [NSNumber numberWithInt:9],@"Nine",
                                              nil];
NSNumber *number = [stringToNumber objectForKey:cardName];
if(number) [self setValue:[number intValue]];


답변

조금 늦었지만 미래의 누군가를 위해 나는 이것을 위해 나를 도울 수있었습니다.

#define CASE(str) if ([__s__ isEqualToString:(str)])
#define SWITCH(s) for (NSString *__s__ = (s); ; )
#define DEFAULT


답변

그것을 쓰는 더 지능적인 방법이 있습니다. “맞춤법 스타일”NSNumberFormatter 에서 를 사용합니다 .

NSString *cardName = ...;

NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
[nf setNumberStyle:NSNumberFormatterSpellOutStyle];
NSNumber *n = [nf numberFromString:[cardName lowercaseString]];
[self setValue:[n intValue]];
[nf release];

숫자 포맷터는 문자열을 소문자로 원하므로 포맷터로 전달하기 전에 직접해야합니다.


답변

다른 방법이 있지만 switch그중 하나가 아닙니다.

예제와 같이 몇 개의 문자열 만 있으면 코드가 좋습니다. 많은 경우에 문자열을 사전에 키로 저장하고 해당 값을 찾을 수 있습니다.

NSDictionary *cases = @{@"Six" : @6,
                        @"Seven" : @7,
                        //...
                       };

NSNumber *value = [cases objectForKey:cardName];
if (value != nil) {
    [self setValue:[value intValue]];
}