【问题标题】:Comparing a string to an array in objective-C在Objective-C中将字符串与数组进行比较
【发布时间】:2009-06-18 10:42:15
【问题描述】:

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

我有一个字符串,我想将它与一个字符串数组进行比较。只有当字符串不是数组的一部分时,我才想执行操作。我尝试了以下代码,但不起作用。我明白为什么,但我就是想不出正确的方法。

请帮助我摆脱痛苦。

提前致谢

夏克林

-(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"];

【问题讨论】:

  • 您能否在问题中添加为什么它不起作用?

标签: objective-c arrays string comparison


【解决方案1】:

您的代码似乎运行良好。它的代码很糟糕,但它工作正常,任何匹配都会调用 // do nothing 部分,而数组中的每个不匹配都会调用 // do something 部分。我怀疑问题是您希望 // do nothing 部分在没有匹配的情况下执行一次,并且 // do something 部分在有任何匹配的情况下执行一次,但事实并非如此。你可能想要:

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

【讨论】:

  • 谢谢彼得。虽然 KiwiBastard 已经给出了有用的答案,但你的彻底性实际上教会了我比我所要求的更多。在我的辩护中:我有点即兴创作的阿尔法阵列使这个例子可以理解。在我的真实代码中,我只使用现有的数组。
【解决方案2】:

我不确定您上面的代码为什么不起作用,但是您尝试过吗:

if ([ALPHA_ARRAY containsObject:aString]) 

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

【讨论】:

  • 非常感谢。这是我不知道存在的“containsObject”。我将审查我的其余代码以摆脱许多繁琐的“for”循环!
  • 另外,如果您感兴趣,它可以比较字符串的相等性(isEqualToString)而不是比较指针。见stackoverflow.com/questions/5811121/…
【解决方案3】:

#define 对我来说看起来很奇怪。我认为每次使用 ALPHA_ARRAY 都会创建一个不同的 NSArray 实例。在 NSArray 上使用 containsObject: 方法会更干净:

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

【讨论】:

  • 这是最干净的方法,我想知道为什么对这些的支持较少。
猜你喜欢
  • 2016-10-17
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多