将Class作为参数传递并使用此类实例化对象

时间:2014-05-30 08:37:53

标签: ios objective-c

这是可能的,我在网上搜索并没有找到答案。我的大四学生也说过这是不可能的。

我试图将其添加为一个类别,所以我想从中提取4种类型的对象,它们都使用相同的代码,它只是不同的类,所以我想这个:

- (NSDictionary *) getObjectsOfClass:(Class)class
{

    NSMutableDictionary *objDict = [NSMutableDictionary dictionary];

    [self.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if ([obj isKindOfClass:class]) {

            /*
            Is there a way to do this?
            class *label = (class *)obj;

            */


        }
    }];

    return objDict;
}

有没有办法让这项工作?看到4个功能几乎相同的代码很难看,你同意吗?

4 个答案:

答案 0 :(得分:4)

如何将类名作为字符串&从中创建对象。可能是这样的

    -(NSArray *)arrayOfObjectsForClass:(NSString *)className{

        NSMutableArray *objectArray = [[NSMutableArray alloc]init];
        CGFloat yAxis = 10;
        for(int i =0;  i<5; i++){
           id object = [[NSClassFromString(className) alloc]initWithFrame:CGRectMake(0, yAxis, 100, 50)];
           [object setTitle:[NSString stringWithFormat:@"Button %d", i+1]];
           [objectArray addObject:object];
           yAxis+= 60;
         }

       return objectArray;
    }

答案 1 :(得分:2)

您可以像这样实例化class参数:

id newInstance = [class new];

你无法在语法上做的是使用class *作为告诉编译器本地变量的类型的方法。但是,由于Objective C动态类型化功能,这也不是必需的。

换句话说,没有理由转换为class(你不能这样做; class只在运行时知道,转换在编译时有效。)

编辑:

如果您知道所有课程共有的基类,例如UIView,那么你可以这样做:

UIView* newInstance = obj;

然后访问其属性,例如:

if (newInstance.tag ==…)

或者您可以使用消息发送而不是属性来执行:

if ([obj tag] == ...)

答案 2 :(得分:2)

如果所有这些都是从公共基类派生的,则可以将它们转换为该公共基类。如果没有可用的函数很少,则创建该公共基类的类别,并将这些常用函数添加到其中。这将允许您使用单个代码块而不是4个不同的代码块。

答案 3 :(得分:2)

因为你说“但是我将它添加到uiview,获取文本字段,标签,pickerviews等,以便我可以调用[self.view getObjectsOfClass:[UILabel class]”

对于此代码

  [self.view getObjectsOfClass:[UILabel class]];

它会返回它所有的UILabel直接孩子。

- (NSMutableArray *) getObjectsOfClass:(Class)class
{

    NSMutableArray *objArray = [NSMutableArray array];

    [self.subviews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {


        // All visible things are inherited from UIView. Tag property is belongs to UIView
        // UILabel are inherited from UIView
        if ([self isKindOfClass:[UIView class]] && [obj isKindOfClass:class]) {

            UIView *aView = (UIView*)obj;

            if (aView.tag == 100) {

                //This is the view with tag 100

            }

            [objArray addObject:obj];


        }
    }];

    return objArray;
}