programing

Objective-C가 NSString을 켤 수 있습니까?

powerit 2023. 6. 2. 21:21
반응형

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, Two는 대소문자 1 등과 같습니다.

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

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;
}

유감스럽게도 스위치 문은 기본 유형에서만 사용할 수 있습니다.하지만 컬렉션을 사용하는 몇 가지 옵션이 있습니다.

NS Dictionary에 각 값을 항목으로 저장하는 것이 가장 좋은 방법일 것입니다.

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]];
}

단연코..내가 가장 좋아하는 "ObjC 추가 기능"은

objswitch(someObject)
    objcase(@"one") { // Nesting works.
        objswitch(@"b")
            objcase(@"a") printf("one/a");
            objcase(@"b") printf("one/b");
            endswitch // Any code can go here, including break/continue/return.
    }
    objcase(@"two") printf("It's TWO.");  // Can omit braces.
    objcase(@"three",     // Can have multiple values in one case.
        nil,              // nil can be a "case" value.
        [self self],      // "Case" values don't have to be constants.
        @"tres", @"trois") { printf("It's a THREE."); }
    defaultcase printf("None of the above."); // Optional default must be at end.
endswitch

그리고 끈이 아닌 것에도 작동하고, 루프에서도 작동합니다!

for (id ifNumericWhatIsIt in @[@99, @0, @"shnitzel"])
    objswitch(ifNumericWhatIsIt)
        objkind(NSNumber)  printf("It's a NUMBER.... "); 
        objswitch([ifNumericWhatIsIt stringValue])
            objcase(@"3")   printf("It's THREE.\n"); 
            objcase(@"99")  printf("It's NINETY-NINE.\n"); 
            defaultcase     printf("some other Number.\n");
       endswitch
    defaultcase printf("It's something else entirely.\n");
endswitch

It's a NUMBER.... It's NINETY-NINE.
It's a NUMBER.... some other Number.
It's something else entirely.

가장 좋은 것은, 너무 적다는 것입니다.{...}의,:의 , 및()

Objective-c는 이 측면에서 c와 다르지 않으며 c만 켤 수 있습니다(그리고 궁극적으로 NSInteger, NSUInteger와 같은 사전 프로그램 정의).

위키백과:

c 구문:

switch 문을 사용하면 식의 값에 따라 여러 문 중 하나로 제어력이 전달됩니다. 에는 적분 유형이 있어야 합니다.

적분 유형:

컴퓨터 과학에서 정수(▁data數, )는 정수의 일부 유한 부분 집합을 나타내는 데이터 유형인 적분 데이터 유형의 데이텀입니다.통합 데이터 유형은 크기가 다를 수 있으며 음수 값을 포함하거나 포함하지 않을 수 있습니다.

파티에 좀 늦었지만, 언급된 질문에 답하자면, 더 현명한 방법이 있습니다.

NSInteger index = [@[@"Six", @"Seven", @"Eight", @"Nine"] indexOfObject:cardName];
if (index != NSNotFound) [self setValue: index + 6];

:indexOfObject를 사용하여 일치하는 을 찾습니다.isEqual:그 문제와 꼭 같이

이전에 게시된 @Graham Perks 아이디어를 기반으로 하여 스트링 스위치를 상당히 간단하고 깨끗하게 만들 수 있는 간단한 클래스를 설계했습니다.

@interface Switcher : NSObject

+ (void)switchOnString:(NSString *)tString
                 using:(NSDictionary<NSString *, CaseBlock> *)tCases
           withDefault:(CaseBlock)tDefaultBlock;

@end

@implementation Switcher

+ (void)switchOnString:(NSString *)tString
                 using:(NSDictionary<NSString *, CaseBlock> *)tCases
           withDefault:(CaseBlock)tDefaultBlock
{
    CaseBlock blockToExecute = tCases[tString];
    if (blockToExecute) {
        blockToExecute();
    } else {
        tDefaultBlock();
    }
}

@end

다음과 같이 사용할 수 있습니다.

[Switcher switchOnString:someString
                   using:@{
                               @"Spades":
                               ^{
                                   NSLog(@"Spades block");
                               },
                               @"Hearts":
                               ^{
                                   NSLog(@"Hearts block");
                               },
                               @"Clubs":
                               ^{
                                   NSLog(@"Clubs block");
                               },
                               @"Diamonds":
                               ^{
                                   NSLog(@"Diamonds block");
                               }
                           } withDefault:
                               ^{
                                   NSLog(@"Default block");
                               }
 ];

올바른 블록이 문자열에 따라 실행됩니다.

이 솔루션의 요점

매크로 접근 방식을 사용하면 다음과 같은 이점을 얻을 수 있습니다.

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

SWITCH (string) {
    CASE (@"TestString") {
        break;
    }
    CASE (@"YetAnotherString") {
        break;
    }
    CASE (@"Test") {
        break;
    }
    DEFAULT {
        break;
    }
 }

저는 @Cris 답변에 대한 Cris의 답변에 대해 논평할 수 없지만, 저는 다음과 같이 말하고 싶습니다.

@cris의 방법에는 제한이 있습니다.

typedefenum은 영숫자 값을 사용하지 않습니다.

typedef enum
{
  12Ace, 23Two, 23Three, 23Four, F22ive ... Jack, Queen, King

} CardType;

여기 또 다른 것이 있습니다.

스택 연결 흐름 이 사용자 답변 "user1717750"으로 이동합니다.

typedef enum
{
    Six,
    Seven,
    Eight
} cardName;

- (void) switchcardName:(NSString *) param {
    switch([[cases objectForKey:param] intValue]) {
        case Six:
            NSLog(@"Six");
            break;
        case Seven:
            NSLog(@"Seven");
            break;
        case Eight:
            NSLog(@"Eight");
            break;
        default: 
            NSLog(@"Default");
            break;
    }
}

코딩하기...

언급URL : https://stackoverflow.com/questions/8161737/can-objective-c-switch-on-nsstring

반응형