在Objective-C中比较字符串和数组

6

这是一个非常基本的问题,我相信您会很快回答。请不要嘲笑我的无知。

我有一个字符串,想将其与一个字符串数组进行比较。只有当该字符串不是数组的一部分时,才想执行某个操作。我尝试了下面的代码,但它并不起作用。我知道为什么,但我就是想不出如何正确地做。

请帮帮我摆脱这种困境。

谢谢您提前。

Sjakelien

-(void) findRedundant: (NSString *) aString {
#define ALPHA_ARRAY [NSArray arrayWithObjects: @"A", @"B", @"C", nil]   
    NSUInteger f;
    for (f = 0; f < [ALPHA_ARRAY count]; f++) 
    {
        NSString * stringFromArray = [ALPHA_ARRAY objectAtIndex:f];
        if ([aString isEqualToString:stringFromArray]) {
            // do nothing

        } else {
            //do something
        }

    }

}



[self findRedundant:@"D"];

1
你能在问题中加上为什么它不起作用吗? - Brian Ramsay
3个回答

14

你的代码似乎工作正常。尽管它是可怕的代码,但它工作正常,对于任何匹配项都会调用“啥也不做”的部分,并且对于数组中每个不匹配项都会调用“做些什么”的部分。我猜问题在于你期望如果没有匹配,则“啥也不做”部分执行一次,如果有任何匹配,则“做些什么”部分执行一次,但实际情况并非如此。你可能想要:

-(void) findRedundant: (NSString *) aString {
#define ALPHA_ARRAY [NSArray arrayWithObjects: @"A", @"B", @"C", nil]
    BOOL found = NO;
    NSUInteger f;
    for (f = 0; f < [ALPHA_ARRAY count]; f++) {
        NSString * stringFromArray = [ALPHA_ARRAY objectAtIndex:f];
        if ([aString isEqualToString:stringFromArray]) {
            found = YES;
            break;
        }
    }
    if ( found ) {
        // do found
    } else {
        // do not found
    }
}

此外,你显然不理解宏及其何时该使用和不该使用的情况(通常来说,你几乎永远不应该使用它们,只有极少数例外)。这个宏被文本替换到你的代码中。这意味着每次使用 ALPHA_ARRAY 时,数组的创建和初始化都会发生每一次。这是很糟糕的。

基本上,在你更深入地理解自己在做什么之前,永远不要再使用 #define(除了常量)。在这种情况下,你可以像 taebot 描述的那样创建数组:

NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil];

接下来,如果你正在为一个现代平台(10.5或iPhone)开发,你可以使用快速枚举,这样更容易阅读和理解:

-(void) findRedundant: (NSString *) aString {
    NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil];
    BOOL found = NO;
    for ( NSString* stringFromArray in alphaArray ) {
        if ([aString isEqualToString:stringFromArray]) {
            found = YES;
            break;
        }
    }
    if ( found ) {
        // do found
    } else {
        // do not found
    }
}

最后,你应该阅读NSArray和NSString文档以了解可以免费使用哪些功能,然后你会发现像KiwiBastard指出的containsObject这样的方法,然后你可以将你的例程改写为:

-(void) findRedundant: (NSString *) aString {
    NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil];
    if ( [alphaArray containsObject: aString] ) {
        // do found
    } else {
        // do not found
    }
}

谢谢Peter。虽然KiwiBastard已经给出了有用的答案,但是您的彻底解释实际上教会了我比我所问的更多内容。 为自己辩护:Alpha Array是我随意创作的,只是为了让这个例子更容易理解。在我的真实代码中,我只使用现有数组。 - Sjakelien

8

我不确定你上面的代码为什么不起作用,但你尝试过以下方法吗:

if ([ALPHA_ARRAY containsObject:aString]) 

如果aString存在,则返回YES,否则返回NO。


非常感谢。我之前不知道“containsObject”这个方法的存在。我会检查我的代码并消除很多繁琐的‘for’循环! - Sjakelien
如果您有兴趣,它可以比较字符串的相等性(isEqualToString),而不是比较指针。请参阅https://dev59.com/CW025IYBdhLWcg3wwo6m - Soulfire

7

#define 这个语法我觉得很奇怪。我认为每次使用 ALPHA_ARRAY 时都会创建一个不同的 NSArray 实例。使用 NSArray 的 containsObject: 方法会更加简洁:

NSArray* alphaArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil];
if (![alphaArray containsObject:aString]) {
    // do something
}

这是最干净的方法,我想知道为什么没有更多的赞。 - arango_86

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接