【问题标题】:How to abstract class names or types in Objective C to use as variables?如何在Objective C中抽象类名或类型以用作变量?
【发布时间】:2026-02-23 16:30:01
【问题描述】:

我已经意识到我的几个列表视图控制器的行为方式相同,现在我想将它们抽象为一个名为 ListVC 的通用控制器。计划是在需要时创建 ListVC 的实例,并将该实例所需的所有特定内容传递给它。

例如,如果我需要一个客户列表,我会这样做:

ListVC *customersVC = [[ListVC alloc] init];
customersVC.tableArray = self.customersList

在 ListVC 中,有时我需要知道某个对象的类类型。在我的示例中,数组self.customersList 中的对象来自CustomerClass 类。我知道我可以convert strings to class names 但当我在 ListVC 中有一个需要返回对象类型的方法时,这无济于事。例如,在 ListVC 中,这个旧的非抽象方法:

- (CustomerClass *)customerAfterFilter

应该是这样的:

- (self.objectClass *)objectAfterFilter

我会在 objectClass 像这样实例化之后设置它。

ListVC *customersVC = [[ListVC alloc] init];
customersVC.tableArray = self.customersList    
customersVC.objectClass = [CustomerClass class];

我该如何做这样的事情?或者,如果我的方法是错误的,请提出正确的方法。我是编程初学者。

【问题讨论】:

    标签: iphone ios objective-c abstract-class


    【解决方案1】:

    你不能这样改变返回类型。你可以做的是返回一个id,它是一个指向任何类的对象的指针。

    - (id)objectAfterFilter
    

    编辑:

    Customer *c = [customersVC objectsAfterFilter];
    [c duCustomerStuff];
    

    或者:

    [((Customer *)[customersVC objectsAfterFilter]) doCustomerStuff];
    

    【讨论】:

    • 我将如何访问返回的对象的属性和方法?
    • 就像平常一样。将返回类型更改为 id 不会对该对象执行任何操作。您只是失去了一些安全性,因为编译器也不知道类型。但是,您可以使用常规指针来保存返回对象的引用。查看我的编辑。