Here是如何枚举javascript对象的属性的示例。我注意到使用的循环结构是{{1}}循环。 Objective-C也有for...in
循环,在Objective-C中可能出现相同的行为吗?
for...in
Objective-C可以实现吗?如果没有,是否有一种替代方案可以模仿迭代对象属性的这种行为?
答案 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)
Bar *obj = [[Bar alloc] init];
// ...
for (id elem in obj) {
...
}
要求班级{{1}}符合NSFastEnumeration
Protocol,即必须实施
Bar
方法。 (所有Objective-C集合类都是这种情况,例如countByEnumeratingWithState:objects:count:
,NSArray
,NSDictionary
。)
因此,对您的问题的直接回答是 no ,您不能使用快速枚举语法NSSet
来枚举任意类的所有属性。
但是,可以为自定义类实现快速枚举协议。 如何做到这一点的例子可以在这里找到