Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在objective-c中创建两个模型类的包装器类_Objective C_Ios_Core Data_Nsmanagedobject - Fatal编程技术网

如何在objective-c中创建两个模型类的包装器类

如何在objective-c中创建两个模型类的包装器类,objective-c,ios,core-data,nsmanagedobject,Objective C,Ios,Core Data,Nsmanagedobject,我正在开发一个应用程序,我有两个非常相似的模型类。我想在一个视图控制器中使用这两个类,该视图控制器的布局基于模型类的属性。问题是我现在有很多if语句来检查它是哪个类 例如: - (UIView *)setUpViewForObject:(id)object { // Check if it is a Post or Event object Post *post; Event *event; if ([object class] == [Event class]

我正在开发一个应用程序,我有两个非常相似的模型类。我想在一个视图控制器中使用这两个类,该视图控制器的布局基于模型类的属性。问题是我现在有很多if语句来检查它是哪个类

例如:

- (UIView *)setUpViewForObject:(id)object
{

    // Check if it is a Post or Event object
    Post *post;
    Event *event;
    if ([object class] == [Event class]) {
        event = (id)object;
    } else if ([object class] == [Post class]) {
        post = (id)object;
    }

    if (post) {
        // Do stuff
        // ie:
        self.customUiView.textField.text = post.text;
    } else if (event) {
        // Do similar stuff
        // ie:
        self.customUiView.textField.text = event.text; 
    }
}  
这个解决方案看起来很多余,我在几个地方做过。因此,我想知道是否有可能创建一个包含两个NSManagedObject类的包装类。我使用CoreData并从xCode生成模型,所以我不会使用所有这些if语句

比如:

@interface News : NSManagedObject
[...]
@property (nonatomic, retain) NSString * text;
[...]

@interface Event : NSManagedObject
[...]
@property (nonatomic, retain) NSString * text;
[...]
是否可以使用枚举创建这两个NSManagedObject类的包装类。我还希望对象是可更新的、可删除的等等。我在想我可能可以使用Enum或类似的东西来创建一个抽象类,但我不知道这样的类会是什么样子、如何工作和如何使用


如果这是可能的,并且在这种情况下像这样的包装类看起来如何,任何建议都将非常感谢

核心数据支持抽象超类的概念。所以你用一个属性来定义它,比如“tag”,它区分了这两个类。然后,新闻和事件都将该类作为其超类。这是用于核心数据的一种非常常见的解决方案。

请尝试以下方法:

//in NewsEventRootObject.h
@interface NewsEventRootObject:NSManagedObject //root object for these two classes

[...]

@property (nonatomic,retain) NSString *text; //similar fields in here

-(void) getSomeValue;

//in News.h
@interface News : NewsEventRootObject

[...]

-(void) getNews;

//in Event.h
@interface Event : NewsEventRootObject

[...]

-(void) getEvent;

//in your "handler".m

- (UIView *)setUpViewForObject:(NewsEventRootObject *) object
{ 
    //you can access similar fields and methods without if/else statements
    self.customUiView.textField.text = object.text;

    SomeValue *someValue=[object getSomeValue];

    //but for class-specific you should make a check
    if ([object respondsToSelector:@selector(getEvent)]) {

    }

    if ([object respondsToSelector:@selector(getNews)]) {

    }

}  

实际上,永远不要通过==,使用isKindOfClass语句检查类

如果([object class]==[Event class])
是危险的,请改用
[object isKindOfClass:[Event class]]]
。这并不理想。它保留了“switch statement/if logic as polymorphics”反模式,这通常意味着多态性将是一个更好的解决方案。如果模型非常相似(如主题中所述),并且Anders不会使用特定于类的方法和变量,这是一个理想的解决方案。谢谢,很难选择给出正确答案的人。你的建议与我最后的建议非常接近。谢谢,抽象超类应该具有所有公共属性还是只有一个?你可以添加所有想要的公共属性。我们使用了这项技术,就像你在教科书中读到的一样——一个“动物”基类,然后是专门的子类等等。效果非常好!然后,您可以在设置属性之前使用抽象超类测试对象“isKindOfClass:”。很酷,这将如何处理我在原始问题中发布的代码示例以及if语句。我能像@bogdan andresyuk在他的回答中写的那样做吗,或者这会有不同的效果吗?我的模型现在更干净了,太棒了!但如果我不需要所有这些if语句,那就更好了。谢谢是-但是向根添加一个新字段,如“tag”,并将其设置为整数,然后使用#defines将其设置为不同类的不同数字。然后,您可以在“标记”值上进行测试,这可能比在类上进行测试更容易键入。最后,这是同样的逻辑测试,只是我建议的(IMHO)更容易输入。