核心数据方法的类扩展

时间:2012-04-02 23:54:11

标签: objective-c ios core-data

有人可以告诉我如何“隐藏”标准核心数据设置者吗?

我知道在Objective-C中没有真正的方法来定义'Private'方法,但是阅读使用扩展来实现类似的结果。问题是,我想将其应用于核心数据类。我想隐藏为某些属性创建的标准setter,并且只从其他暴露的setter中调用它们。

一个例子:我的核心数据对象有一个BOOL'收集'和一个日期'dateCollected'。我已经想出如何将setDateCollected添加到setCollected,但现在我想'隐藏'收集的集合,以便不能直接调用它(当我可能忘记也手动设置dateCollected时)。

澄清一下,让我沮丧的部分是'@dynamic'电话 - 我不知道这些应该在哪里生活。

编辑 - 我想我错过了一部分。我可以将@property声明移动到实现文件中。但我希望隐藏二传手,并让吸气者保持公开。我想我需要替换@property,但我不知道如何为核心数据对象做这个。

2 个答案:

答案 0 :(得分:1)

您尝试做的事情不太可能带来好结果。 Core Data类非常精细地设置了图层次结构,属性实现存在于超类中。也许你应该删除收集的变量,只需对dateCollected进行零检查。另一种稍微复杂的方法是将其从数据模型中删除并使其成为常规的ivar。

编辑:好的,我看了你评论中的信息。如果您遵守某些准则,它确实建议您可以覆盖实施。但是,下面的答案可能更好。将属性移动到专用接口。然后在公共接口(readonly)中声明另一个属性,该属性返回私有属性的值;)。

答案 1 :(得分:0)

您可以在实现文件中定义私有方法。如果头文件中没有显示方法,那么根据定义,它是私​​有的。为了澄清,以下是如何定义公共属性和方法。

@interface MyAppViewController : UIViewController

@property (strong, nonatomic) NSString *myPublicStringObject;

- (NSString *) myPublicMethodTakingInputString:(NSString *) input;

@end

在实现文件中,您可以按如下方式定义私有属性和方法。

#import "MyAppViewController.h"

// Declare private properties and methods inside the following interface extension
@interface MyAppViewController ()

@property (strong, nonatomic) NSNumber     *myPrivateNumber;
@property (strong, nonatomic) NSString     *myPrivateStringObject;

- (void) myPrivateMethod1;
- (NSString *) myPrivateMethod2WithIntegerInput:(NSInteger) input;

@end


@implementation MyAppViewController

@synthesize myPublicStringObject;
@synthesize myPrivateNumber;
@synthesize myPrivateStringObject;

// Implement all methods declared in header and private interfaces here in no particular order
- (NSString *) myPublicMethodTakingInputString:(NSString *) input
{
// code for myPublicMethodTakingInputString
}

- (void) myPrivateMethod1
{
}

- (NSString *) myPrivateMethod2WithIntegerInput:(NSInteger) input
{
}


// Implement any other private method not declared
- (NSString *) myUndeclaredPrivateMethod1:(NSString *) input
{
// code for myUndeclaredPrivateMethod1
}


- (id) myUndeclaredPrivateMethod2
{
// code for myUndeclaredPrivateMethod2
}

...等

此说明适用于iOS 5。 iOS3& amp;的语法除了私有即时变量(iVars)出现在头文件中之外,图4是类似的 - 这对新手来说可能非常混乱。 iOS 5通过不要求即时变量出现在任何地方来清理它。