枚举对象属性

时间:2014-04-06 04:01:21

标签: objective-c for-loop properties

Here是如何枚举javascript对象的属性的示例。我注意到使用的循环结构是{​​{1}}循环。 Objective-C也有for...in循环,在Objective-C中可能出现相同的行为吗?

for...in

Objective-C可以实现吗?如果没有,是否有一种替代方案可以模仿迭代对象属性的这种行为?

2 个答案:

答案 0 :(得分:3)

简短回答:是的,有可能

以下是您尝试实现的一些示例代码。

标题

@interface Bar : NSObject

@property (nonatomic, retain) NSString *stringA;
@property (nonatomic, retain) NSString *stringB;
@property (nonatomic, retain) NSString *stringC;

@end

主要

@implementation Bar
// don't forget to synthesize
@synthesize stringA, stringB, stringC;
@end

int main(int argc, char *argv[]) {
    @autoreleasepool {
        unsigned int numberOfProperties = 0;
        objc_property_t *propertyArray = class_copyPropertyList([Bar class], &numberOfProperties);

        for (NSUInteger i = 0; i < numberOfProperties; i++)
        {
            objc_property_t property = propertyArray[i];
            NSString *letter = [[NSString alloc] initWithUTF8String:property_getName(property)];
            NSString *attributesString = [[NSString alloc] initWithUTF8String:property_getAttributes(property)];
            NSLog(@"Property %@ attributes: %@", letter, attributesString);
        }
        free(propertyArray);
    }
}

如果您有任何问题,请与我们联系。

答案 1 :(得分:2)

Fast enumeration

Bar *obj = [[Bar alloc] init];
// ...
for (id elem in obj) {
   ...
}

要求班级{{​​1}}符合NSFastEnumeration Protocol,即必须实施

Bar

方法。 (所有Objective-C集合类都是这种情况,例如countByEnumeratingWithState:objects:count: NSArrayNSDictionary。)

因此,对您的问题的直接回答是 no ,您不能使用快速枚举语法NSSet来枚举任意类的所有属性。

但是,可以为自定义类实现快速枚举协议。 如何做到这一点的例子可以在这里找到