【问题标题】:Get property name of object as string in Objective-C [closed]在Objective-C中获取对象的属性名称作为字符串[关闭]
【发布时间】:2014-03-01 16:26:05
【问题描述】:

假设您有一个具有属性“testProperty”的类“Foo”。目的是将属性名称(不是值)作为NSString。这个问题可能与 Get property name as a string 重复。但这些答案对我没有帮助,因为:

  • 我不需要所有属性。我只需要一个特定的。
  • 对于NSStringFromSelector(@selector(prop)) - 无论如何你必须输入字符串。

假设我有一个类似

的函数
- (NSString *)propertyToString:(id)propertyOfObject

在这种情况下,我可以使用,例如,用于排序

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:[self propertyToString:foo.testProperty] ascending:NO]; 

所以最后,代码是干净的。

【问题讨论】:

  • 您说-“我想要一个特定的,而不是全部。”...嗯..如果您不知道它的名称,您怎么知道您想要哪个特定的?如果你知道的话,那就自己创建字符串...?
  • 您的问题与您链接的问题重复。只需按照您链接的答案进行操作,并且在遍历所有属性时,只需存储您想要的一个并忽略其余的。
  • @Michal,我想让我的代码干净,这就是我不想使用字符串常量的原因。
  • @razor28 隐藏您正在使用的属性的名称并不干净。想象一下在您切换到不同项目后接管您的代码的人。他/她是否会立即知道您的代码中发生了什么,如果您实际上将属性名称合并到字符串中,除非它实际上在 lldb 中运行,否则无法看到?
  • 现在很清楚这个问题在问什么,这个问题已经更新了一个实际的例子。请重新打开。

标签: ios objective-c properties introspection objective-c-runtime


【解决方案1】:

这是不可能的。您想获取属性名称,但您需要传递一些内容以将其与其他名称区分开来。

【讨论】:

  • 输入是 foo.testProperty。
  • @razor28。你找到解决办法了吗?
【解决方案2】:

代码未经测试。 应该是这样的:

#import <objc/runtime.h>

Class cls = [Foo class];
u_int count;
objc_property_t* props = class_copyPropertyList(cls,&count);
for(int i=0;i<count;i++){
    NSString* propname = [NSString stringWithUTF8String:property_getName(props[i])];
    if([propname hasPrefix:@"test"])
        NSLog(@"foo");
}

您正在寻找一种选择道具集子集的方法。您唯一能做的就是应用某种过滤器 - 可能是上述属性的命名约定 - 将属性集减少到您想要的。

【讨论】:

  • 目的是不使用任何字符串常量。输入应该是 foo.testProperty。
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 2016-01-16
  • 2019-12-07
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
相关资源
最近更新 更多