【问题标题】:Compare NSDictionaries containing NSStrings比较包含 NSStrings 的 NSDictionaries
【发布时间】:2013-07-19 23:45:50
【问题描述】:

我有两个包含NSStringsNSDictionaries。为了比较这两个字典,我使用isEqualToDictionary: 方法。 isEqualToDictionary:says 上的文档

“如果两个字典都包含相同数量的条目,则两个字典具有相同的内容,并且对于给定的键,每个字典中的相应值对象满足 isEqual: 测试。”

所以,我的字符串是通过isEqual: 方法比较的。

问题是:
isEqual: 如何为 NSString 工作?

它是否使用来自NSObjectisEqual:? 我读过isEqual 来自NSObject 只是比较地址,使用==。 为了证明或反驳这个想法,我写了一个示例:

NSString *str1 = @"sampleString";
NSString *str2 = [NSString stringWithFormat:@"%@", @"sampleString"];
BOOL result = [str1 isEqual:str2];

resultYES,但str1str2 的地址不同。
因此,要么它不使用来自NSObjectisEqual:(比什么?),要么NSObjectisEqual: 做了一些比只检查地址相等性更复杂的事情。

有人知道它是如何工作的吗?

【问题讨论】:

  • 为什么不能使用 isEqualToString 方法?太容易了?
  • @SamBudda 不是我,是 NSDictionary 使用 isEqual:比较它的元素。

标签: ios objective-c macos cocoa foundation


【解决方案1】:

NSString 覆盖 isEqual: 以正确比较字符串,因此您可以通过这种方式比较字典。

【讨论】:

  • 谢谢。有没有办法确保它? NSString 的标题和文档什么也没说。
  • 我找到了,这个事实在《Objective-c Programming: The Big Nerd Ranch Guide》中有提到。
  • @Anastasia 此外,在isEqualToString: 下的文档中非常间接地提到了它,它说当两者都是字符串时它与isEqual: 相同,但速度更快。
【解决方案2】:

isEqualToDictionary 将每个对象与 isEqual 进行比较。

在我的情况下,它不适用于我字典中的 NSString 对象。所以我做了一个非常简单的解决方法。我比较了两本词典的描述。这适用于包含 NSString 和 NSNumber 的字典以及包含描述方法的所有对象。

[[myDict1 description] isEqualToString:[myDict2 description]]

【讨论】:

    【解决方案3】:

    比较字典的文字描述。我在单元测试中使用它。

    NSString *a = dictionary.description;
    NSString *b = assertation.description;
    BOOL test = [a isEqualToString:b];
    

    【讨论】:

    • NSDictionary 我认为没有排序。
    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 2016-06-24
    • 2011-09-18
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多