【问题标题】:NSManagedObject Number Comparison FailingNSManagedObject 编号比较失败
【发布时间】:2016-02-05 06:29:32
【问题描述】:

我正在更新 iOS 应用程序 - 自 iOS 7 以来它没有引起太多关注。

我发现以下比较:

[selectedFile valueForKey:@"canTransferToExternalApp"] == [NSNumber numberWithInt:1]

[selectedFile valueForKey:@"canTransferToExternalApp"] 返回的值为 1 时返回 false。过去返回 true。发生了什么变化?

【问题讨论】:

  • "selectedFile" 是字典对吗?
  • selectedFile 是一个 NSManagedObject
  • 整个代码都在 if() 条件下吗?
  • 整行代码看起来像: latestVersionDownloadedLabel.text = ([selectedFile valueForKey:@"latestVersionDownloaded"] == [NSNumber numberWithInt:1]) ? @“是”:@“否”;
  • 要么你必须将 NSManagedObj 转换为 NSDictionary

标签: ios objective-c nsmanagedobject


【解决方案1】:

您需要避免对 NSObjects 使用等号运算符,以供回答比较相关问题的人参考。

https://stackoverflow.com/a/1319280/933887

这里的问题是您正在比较内存地址,而不是对象的值。您可以在此处阅读有关对象比较的更多信息:Introspection

总的来说,以下是一个很好的解决方案:

[[selectedFile valueForKey:@"canTransferToExternalApp"] isEqual:[NSNumber numberWithInt:1]]

您可以使用isEqualToNumber:,但您需要确保您是在比较 NSNumbers 而不是其他任何东西。所以为了安全起见,我建议坚持使用isEqual:

【讨论】:

  • 好的——这样就可以了。但是为什么它过去可以工作,现在却被打破了?我可能有很多这样的代码 - 如果它是错误的 - 很公平 - 但为什么它曾经工作过?
  • 在使用正数时它似乎对我来说完美无缺,但在使用负数时它往往会失败。无论如何,在与对象交互时使用比较函数似乎是更好、更可靠的方法。
【解决方案2】:

希望成功

[NSNumber numberWithInt:[selectedFile[@"canTransferToExternalApp"]]] isEqualToNumber [NSNumber numberWithInt:1]

尝试在int或NSString中使用相同的比较

如果 NSManagedObjects 不直接比较值然后首先将NSManagedObjects 转换为NSDictionary..... 例如:

NSArray *keys = [[[selectedFile entity] attributesByName] allKeys];
    NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys];

    [NSNumber numberWithInt:[dict[@"canTransferToExternalApp"]]] isEqualToNumber [NSNumber numberWithInt:1]

【讨论】:

  • 将 NSManagedObject 转换为字典没有帮助。
猜你喜欢
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多