List of class properties in Objective-C

前端 未结 6 1944
南方客
南方客 2020-11-29 17:32

Is there a way to get an array of class properties of certain kind? For example if i have interface like this

@interface MyClass : NSObject
    @property (st         


        
6条回答
  •  既然无缘
    2020-11-29 17:51

    The solution of serhats is great unfortunately it doesn't work for iOS (as you mentioned) (and this question is tagged for iOS). A workaround would be to get a NSDictionary representation of the object and then access it normally as key-value pairs. I would recommend a category for NSObject:

    Header-File:

    @interface NSObject (NSDictionaryRepresentation)
    
    /**
     Returns an NSDictionary containing the properties of an object that are not nil.
     */
    - (NSDictionary *)dictionaryRepresentation;
    
    @end
    

    Implementation-File:

    #import "NSObject+NSDictionaryRepresentation.h"
    #import 
    
    @implementation NSObject (NSDictionaryRepresentation)
    
    - (NSDictionary *)dictionaryRepresentation {
        unsigned int count = 0;
        // Get a list of all properties in the class.
        objc_property_t *properties = class_copyPropertyList([self class], &count);
    
        NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] initWithCapacity:count];
    
        for (int i = 0; i < count; i++) {
            NSString *key = [NSString stringWithUTF8String:property_getName(properties[i])];
            NSString *value = [self valueForKey:key];
    
            // Only add to the NSDictionary if it's not nil.
            if (value)
                [dictionary setObject:value forKey:key];
        }
    
        free(properties);
    
        return dictionary;
    }
    
    @end
    

    Borrowed from this article: http://hesh.am/2013/01/transform-properties-of-an-nsobject-into-an-nsdictionary/

    This way you could do something similar as serhats mentioned:

    for (NSString *key in objectDic.allKeys) {
       if([objectDic[key] isKindOfClass:[UILabel  class]])
       {
           //put attribute to your array
       }
    }
    

提交回复
热议问题