【问题标题】:Verify if an NSString object's text is contained in a collection of strings (a domain)验证 NSString 对象的文本是否包含在字符串集合(域)中
【发布时间】:2014-06-27 17:30:17
【问题描述】:

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

【问题讨论】:

标签: ios objective-c cocoa nsstring nsarray


【解决方案1】:

让我们尝试使用它

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: 更快的检查相等性的方法

【讨论】:

  • 这个答案如何在现有答案之外增加价值?
【解决方案2】:

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

IsEqualToString 假定您正在发送一个字符串,如果您发送一个 nil 或其他类型的对象,它将崩溃。

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

【讨论】:

    【解决方案3】:

    我从不使用-isEqualToString:,只使用-isEqual:,它可以正常工作! (我这样做了很多年。)

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

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

    【讨论】:

    • 仅供参考 - 如果您知道双方确实是 NSString 对象,则使用 isEqualToString: 会更有效。这应该在循环和其他进行大量字符串比较的地方考虑。
    • 如果另一个对象不是字符串或[NSNull null],我通常只是不希望应用程序崩溃。调用-isEqual: 还会在源文件中节省 8 个字节;)
    • 如我所说,如果您知道双方都是NSSString,请使用isEqualToString:。您的 NSNull 示例显然不适用。
    • 也许你是对的。只是我看到的 99% 的源代码存在比这更糟糕的性能问题,因此这个特定问题不会产生影响。与int list_count = [list count]; for(int i=0; i<list_count; i++) 相比,像for(int i=0; i<[list count]; i++) 这样的for 循环效率很低。甚至if(self.foo.bar.baz.bla < 3) { self.foo.bar.baz.boo = self.foo.bar.baz.bla+2; }。我经常看到这种代码,以至于我无法让自己关心-isEqualToString:isEqual: 的性能。
    • 关注NobodyNada在问题上发布的the link in the comment。事实证明,尽管 Apple 文档声称,对于 NSString,isEqualisEqualToString 之间可能没有显着的性能差异
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    相关资源
    最近更新 更多