Может ли Objective-C включить NSString? - PullRequest
162 голосов
/ 17 ноября 2011

Есть ли более разумный способ переписать это?

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

Ответы [ 13 ]

0 голосов
/ 06 декабря 2017

Опираясь на идею @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");
                               }
 ];

Правильный блок будет выполняться в соответствии со строкой.

Суть для этого решения

0 голосов
/ 08 февраля 2017
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;
    }
}

Наслаждайтесь кодированием .....

0 голосов
/ 19 сентября 2013

Я не могу прокомментировать ответ cris на ответ @Cris, но я хотел бы сказать, что:

ОГРАНИЧЕНИЕ для метода @ cris:

typedef enum не будет принимать буквенно-цифровые символызначения

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

} CardType;

Так вот еще один:

стек ссылок по потоку Перейти к ответу этого пользователя "user1717750"

...