【问题标题】:Objective-C: How to check if 2 properties are the same or not?Objective-C:如何检查两个属性是否相同?
【发布时间】:2011-07-22 06:01:38
【问题描述】:

假设我有 2 个 Person 类实例。一个叫约翰,一个叫玛丽。 Person 类有两个属性 age 和 gender。有没有办法通过所有实例的属性进行迭代并检查当前属性是否等于给定属性?像这样的:

for (iterate thorough all properties of instance mary) {
//first iteration
@selector(mary.age)==@selector(john.age) //this would be YES;

//second iteration
@selector(mary.gender)==@selector(john.age) //this would be NO;
}

【问题讨论】:

  • 所以第一个问题是如何遍历对象的属性:)

标签: iphone objective-c ipad macos


【解决方案1】:

这个问题解决了如何列出对象将响应的选择器:

List selectors for Objective-C object

结合使用 NSObject 协议的 -respondsToSelector: 方法,您可以列出 john 的所有选择器,检查 mary 是否响应它们,反之亦然。

【讨论】:

  • 好吧,我可能没有在问题中说清楚,但这不是我想要的。这将检查 2 个对象是否具有相同的 2 个属性值:age 和 gender。我正在寻找一种方法来比较属性本身,而不是它们持有的值(又名age 与gender 不同,但age 与age 相同,无论值如何)。明白我的意思吗?
  • 我看到你更新了你的答案。 + 1 用于提及链接的问题,这也很有帮助。但是,我不希望找到第二个对象是否响应第一个对象的选择器之一(它总是会这样做,因为它们属于同一类)。我正在检查当前的迭代属性是否与给定属性相同(不是作为值,作为“名称”。例如:propery age form mary 等于propery age from john,即使 john 已经 20 岁并且玛丽 30)
  • 恐怕我还是不明白。 :( 您可以比较选择器名称或方法返回值,但我不知道您还能比较什么。请注意,ObjC 2.0 中的属性只是自动生成的访问器方法,它像任何其他方法一样响应选择器。
  • 好吧,正如你所说:):you can compare selector names 这就是我想做的。但是,-respondsToSelector: 不比较选择器名称,只检查某个对象是否响应某个消息。
  • 正确 - 所以步骤是: 1) 使用 sel_getName() 列出所有 john 的选择器; 2) 对于每个选择器,检查 mary 是否使用 -respondsToSelector: 对其做出响应。 3) 重复 1 和 2,玛丽和约翰颠倒。 4) 如果每次调用 -respondsToSelector: 的结果都是 YES,那么它们的选择器名称是相等的。如果没有,那么约翰有一个玛丽没有,反之亦然。
【解决方案2】:

您可以获取属性名称为NSStrings,并使用isEqualToString: 方法进行比较。

for (iterate thorough all properties of instance mary) {

//first iteration
NSString *marryProperty = [NSString stringWithCString:property_getName(mary.age)
                                            encoding:NSUTF8StringEncoding];
NSString *johnProperty = [NSString stringWithCString:property_getName(john.age)
                                            encoding:NSUTF8StringEncoding];

if([marryProperty isEqualToString:johnProperty])
   NSLog(@"YES");
else 
   NSLog(@"NO");
}

【讨论】:

  • 是的,这就是我想做的。我在解释它时遇到了一些麻烦:D 谢谢!
  • Np。经过一些答案后,我发现这就是您要寻找的东西。
【解决方案3】:

请参阅Printing all declared properties of an object 以迭代并获取属性名称。您可能需要将它们添加到集合中,然后进行比较。如果您想检查类型,它可能会帮助您阅读 objc 运行时指南中的 Declared Properties。

【讨论】:

  • 第二篇链接的文章确实恰到好处。谢谢!我找到了const char *property_getName(objc_property_t property),我可以使用它与迭代相关来解决我的问题。想选择你的答案,但 Cyprian 向社区提供了代码:)......和我自己:P。无论如何都要 +1
猜你喜欢
  • 2023-03-22
  • 2015-01-25
  • 1970-01-01
  • 2023-02-10
  • 2012-10-03
  • 1970-01-01
  • 2023-03-13
  • 2011-06-22
  • 2014-06-11
相关资源
最近更新 更多