我使用MagicalRecord(这是NSManagedObject的一个类别)来获取我的模型。然后我使用通用表视图控制器显示它们,它根据类名显示我的数据。
问题在于,当我想获取这些数据时,我会使用以下内容:
Class type = NSClassFromString(modelName);
NSArray *model = [type MR_findAll];
这完全编译运行,除了xcode显示一个令人讨厌的错误:“没有知道MR_findALL的类方法”。
我可以对NSManagedObject执行类似“类强制转换”的操作,这样错误就会消失吗?我希望保持动态,我不想为我的所有模型定义条件。
答案 0 :(得分:2)
问题不在于静态类型检查。 Class
与id
一样,禁用静态类型检查。
问题是另一回事:在Objective-C中,为了使用[... ...]
语法发送消息,编译器必须首先看到这样的方法声明某处。编译器需要声明的原因是编译器必须将消息调度编译为幕后的objc_msgSend
或objc_msgSend_stret
调用。哪一个取决于方法的返回类型。因此,它必须知道方法的类型(来自声明)才能编译对它的调用。
注意,我说“某个地方”,因为“某个地方”可能与你使用它的地方完全无关。您可以声明一个伪协议,其中包含相同消息的声明,从未在任何地方使用,它将用于声明的目的。或者您可以声明包含它的类别。随你。这对您来说似乎相当不可思议。但是,如果您使用协议获取@ HotLicks的解决方案,并删除强制转换,它仍然没有警告,因为协议是否使用无关紧要 - 这是与此相关的声明。
答案 1 :(得分:0)
定义包含MR_findAll
的协议。在拨打电话之前将您的对象转换为该协议。
[(id<FindAllProtocol>)type MR_findAll]
答案 2 :(得分:-2)
尝试将您的类型变量转换为id,这是一种动态类型。