对未知类的对象调用类方法
我在数组中添加了一组类,我知道它们都具有相同的超类:
[array addObject:[Africa class]]; [array addObject:[Brazil class]]; [array addObject:[France class]];
后来,我想获取类对象并在其上调用超类类方法。 像这样的东西:
Class class = [array objectAtIndex:1]; (Country class) specificClass = class;
我尝试了不同想法的变体,但无法弄清楚如何将最后一行放在代码中。
如果我找到了你,你想要一个指向类对象的变量,静态地输入一个具体的类。
这在Objective-C中是不可能的; 没有强类型的类指针。 Class class
是你能做的最好的。
您可以将任何已知的类方法发送到Class
类型的变量…
[class alloc]; [class defaultManager]; [class myCommonClassMethod];
……没有让编译器抱怨。 当然,某些示例可能在运行时失败。
使用适当的设计模式,您不需要知道您正在使用哪个国家/地区。
首先创建一个AbstractCountry
类,声明(并提供存根实现)您的国家需要通用的所有方法(即国家可以更具体)。
然后为每个国家的AbstractCountry
子类化。
然后:
AbstractCountry *countryClass = [array objectAtIndex:n];
如果您需要仅存在于单个国家/地区的行为,则要么推送存根实现(这不会非常优雅),要么测试对选择器的响应(也不是优雅)或适当地转换(脆弱)。
当然,所有这些都引出了为什么你有这个而不是实例的类的问题(虽然实例设计是相同的;考虑像UIControl和所有子类 – 控件提供控件的抽象行为而子类通过覆盖抽象方法来实现特定类型的控件。
通常在Objective-C中你会调用一个这样的方法:
[class someMethod];
所以在你的情况下,让我们假装你的超类(我假设“国家”)有一个方法来设置人口或东西,它看起来像:
[Africa setPopulation:someInteger];
- UNCalendarNotificationTrigger不会被存储,除非重复是真实的
- 反应本机导航转换问题
- 将NSManagedObject存储在字典(NSDictionary)
- 如何计算通过cellForRowAtIndexPath中的开关设置的单元格的heightForRowAtIndexPath。
- Objective-C:线程中的服务器请求(如Android中的AsyncTask)
- 当App在iOS 10的后台时,推送通知不会被收到
- 创建机器人时Xcode无法单击下一步?
- 找不到-lGTMSessionFetcher的库
- 错误ITMS-90086:缺less64位支持。 提交失败,错误提交在iTunes上的应用程序