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]];
}
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
'programing' 카테고리의 다른 글
루비 스크립트를 디버깅하는 방법 (0) | 2023.06.02 |
---|---|
아이폰 앱 마이너스 앱스토어? (0) | 2023.06.02 |
rhc 설정 시 'no this file dl/import' 오류가 표시됨 (0) | 2023.06.02 |
iPhone 보기가 실행되지 않는 것으로 나타납니다. (0) | 2023.06.02 |
투명한 iOS 탐색 모음 (0) | 2023.06.02 |