iOS:有没有一种方法可以检查NSArray对象是否包含某个字符?

9
我需要一种方法来判断一个数组中的字符串对象是否包含字符“@”。以下代码显然行不通,因为它只检查一个对象是否有@符号,而不是检查一个对象是否包含@符号。例如,如果用户有test@test.com,我的if语句将无法检测到它。我需要知道用户是否有电子邮件。我尝试在stackoverflow上研究如何实现这一点,但没有成功。任何提示或建议将不胜感激。
if([answer containsObject:@"@"]){
  /// do function.                 
}

也许可以用 NSPredicate 来解决? - Larme
1
你的数组中有哪些对象? - rmaddy
如果对象是NSString(如您的示例所示),则可以使用rangeOfString:来检测子字符串。 - Phillip Mills
NSString,抱歉没有明确说明。 - user3606054
4个回答

14
您可以使用 containsObject 来检查 NSArray 是否包含某个对象。如果该数组是由表示为单字符字符串的字符组成,那么代码就很简单:
NSArray *array = @[@"a", @"b", @"c", @"d"];
BOOL contains = [array containsObject:@"c"];

NSArray中没有像'c' char这样的标量类型数组,因为NS集合只包含对象。最接近char数组的是NSString,它有多种方法可以告诉您字符是否存在。最简单的方法如下:

NSString *string = @"test@test.com";
NSRange range = [string rangeOfString:@"c"];
BOOL contains = range.location != NSNotFound;

6

您需要循环遍历数组中的每个NSString,并检查它是否包含子字符串。

以下是此自定义方法的示例:

//assumes all objects in the array are NSStrings
- (BOOL)array:(NSArray *)array containsSubstring:(NSString *)substring {

    BOOL containsSubstring = NO;

    for (NSString *string in array) {

        if ([string rangeOfString:substring].location != NSNotFound) {
            containsSubstring = YES;
            break;
        }
    }
    return containsSubstring;
}

使用方法:

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:3];
[array addObject:@"hi"];
[array addObject:@"yo"];
[array addObject:@"test@test.com"];

BOOL containsSubstring = [self array:array containsSubstring:@"@"];

2
您可以创建一个自定义的NSArray类别,并添加以下方法:
```objective-c - (NSArray *)filteredArrayUsingBlock:(BOOL (^)(id obj, NSUInteger idx, BOOL *stop))block; ```
该方法将返回一个新数组,其中包含原始数组中满足块条件的所有对象。
- (BOOL) containsCharacter:(NSString *) character
{
    BOOL characterFound = NO;
    for (id object in self)
    {
        if ([object isKindOfClass:[NSString class]])
        {
            NSRange range = [object rangeOfString:character];
            if (range.location != NSNotFound)
            {
                characterFound = YES;
                break;
            }
        }
    }

    return characterFound;
}

感谢您,Michael。

还有一个很好的选择。要创建一个类别:文件>新建文件>Objective-C类别>将类别名称设置为任何内容,然后选择NSArray作为类。 - kraftydevil

0

我认为更好的方法是使用谓词来过滤你的数组,就像Larme所说的那样。

试试这样做:

NSArray *answer = @[@"John Appleseed", @"john@apple.com", @"john@icloud.com", @"+14120123456", @"invalid@email", @"another@@@invalid.email"];
NSArray *filteredArray = [answer filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF CONTAINS \"@\""]];
if (filteredArray.count > 0) {
    // Do something
}

filteredArray 将包含所有包含 @ 符号的对象:

john@apple.com,
john@icloud.com,
invalid@email,
another@@@invalid.email

另一种方法是通过筛选有效的电子邮件字符串来过滤数组,而不仅仅是在符号处:
NSArray *answer = @[@"John Appleseed", @"john@apple.com", @"john@icloud.com", @"+14120123456", @"invalid@email", @"another@@@invalid.email"];
NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSArray *filteredArray = [answer filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]];
if (filteredArray.count > 0) {
    // Do something
}

filteredArray 只会包含与电子邮件掩码匹配的对象

john@apple.com,
john@icloud.com

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