而不是长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,那么试验自己可能会产生误导性的结果,所以我想要一个记录在案的答案。
答案 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: