2010-04-01 2 views
0

Я пытаюсь написать эквивалент strchr, но с NSStrings ... В настоящее время я получил это:strchr в объективе C?

Boolean nsstrchr(NSString* s, char c) 
{ 
    NSString *tmps = [NSString stringWithFormat: @"%c", c]; 
    NSCharacterSet *cSet = [NSCharacterSet characterSetWithCharactersInString: tmps]; 
    NSRange rg = [s rangeOfCharacterFromSet: cSet]; 
    return rg.location != NSNotFound; 
} 

Это кажется излишне сложным ... Есть ли способ сделать это (предпочтительно, тот, который не включает поворот NSString в cstring, который удваивает время выполнения или записывает его сам с помощью characterAtIndex: ... Я пропустил какой-то очевидный метод в описании NSString?

+5

'-rangeOfString:'. – kennytm

ответ

2

KennyTM уже отмечалось (в комментарии), которые вы можете использовать -[NSString rangeOfString:] вместо -[NSString rangeOfCharacterFromSet]. Я не имею в виду, чтобы украсть его полезный ответ, но я хотел бы отметить, что вы можете обернуть это в категории на NSString, чтобы сделать его проще в использовании:

@interface NSString (AdditionalStringOps) 
- (BOOL) containsCharacter:(char) c; 
@end 

@implementation NSString (AdditionalStringOps) 

- (BOOL) containsCharacter:(char) c 
{ 
    NSString *tmp = [NSString stringWithFormat:@"%c", c]; 
    return [self rangeOfString:tmp].location != NSNotFound; 
} 

@end 

И тогда вы можете использовать его как так :

if ([myString containsCharacter:'A']) { 
    // Do stuff... 
} 
+0

@OP: Также обратите внимание на использование 'BOOL' вместо' Boolean' для Objective-C (soz, pedantics). – Wevah

0

Как упоминалось в @KennyTM, используйте rangeOfString: Если вам действительно нужно иметь дело с материалом на уровне char, вы можете вытащить char* через -UTF8String (или -cStringUsingEncoding:), а затем ищите своего персонажа, как и на любом другом char* (возможно, используя strchr).

0
Boolean nsstrchr(NSString* s, char c) 
{ 
    NSString *tmps = [NSString stringWithFormat: @"%c", c]; 
    NSRange rg = [s rangeOfString: tmps]; 
    return rg.location != NSNotFound; 
} 
0

Несколько упрощений.

  1. Используйте [s rangeOfString:tmps], чтобы устранить набор символов.
  2. Набор символов может быть создан с помощью [NSCharacterSet characterSetWithRange:NSMakeRange(c, 1)], так что вам не нужно создавать tmps
  3. strchr([s UTF8String], c) - если c является ASCII символов, а возвращаемый указатель не избежит функции (есть риск, указатель становится оборванный).
Смежные вопросы