验证NSString对象的文本是否包含在字符串集合(域)中

时间:2014-05-09 20:46:32

标签: ios objective-c cocoa nsstring nsarray

而不是长if语句,验证字符串是否包含在可能值集合中的更紧凑和可读的方法是什么?换句话说,检查一个值是否在域内?

我想做这样的事......

NSArray* domain = [NSArray arrayWithObjects:@"dog", @"cat", @"bird", nil];
BOOL valueFoundInDomain = [domain containsObject:@"elephant"];

但我担心使用NSString进行等式检查。我想检查文本的值,而不是对象标识。

documentation for NSArray表示containsObject方法使用isEqual方法。但我在documentation for NSString中找不到isEqual实施的解释。 isEqualToString方法的存在表明isEqual可能正在做其他事情。如果其他内容涉及interning of string objects,那么试验自己可能会产生误导性的结果,所以我想要一个记录在案的答案。

3 个答案:

答案 0 :(得分:0)

我从不使用-isEqualToString:,只使用-isEqual:,它只是按预期工作! (我这么做多年了。)

NSString正在实现-isEqual:,如果另一个对象是一个字符串且它具有相同的内容,则返回YES

在Apples Objective-C文档中,从基类重写的方法通常没有明确记录。但是-isEqual:是在所有基础课程中实施的少数方法之一。

答案 1 :(得分:0)

isEqual方法执行额外的类型检查以确保您比较同一类的两个对象。

IsEqualToString假设您正在发送字符串,并且如果您发送其他类型的nil或对象,则会崩溃。

您的代码看起来很适合其用例。

答案 2 :(得分:0)

让我们尝试使用此

NSArray* domain = [NSArray arrayWithObjects:@"dog", @"cat", @"bird", nil];
NSIndexSet *indexes = [domain indexesOfObjectsWithOptions:NSEnumerationConcurrent passingTest:^BOOL(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    return [obj isEqualToString:@"elephant"];
}];
// Where indexes contains matched indexes of array elements 

此处isqualToString:返回一个布尔值,该值使用基于Unicode的文字比较来指示给定字符串是否等于接收者。isEquealTo:返回一个布尔值,指示接收者和给定对象是平等的。当您知道两个对象都是字符串时,isEqualToString:是检查相等性的更快方式,而不是isEqual: