有人可以告诉我如何“隐藏”标准核心数据设置者吗?
我知道在Objective-C中没有真正的方法来定义'Private'方法,但是阅读使用扩展来实现类似的结果。问题是,我想将其应用于核心数据类。我想隐藏为某些属性创建的标准setter,并且只从其他暴露的setter中调用它们。
一个例子:我的核心数据对象有一个BOOL'收集'和一个日期'dateCollected'。我已经想出如何将setDateCollected添加到setCollected,但现在我想'隐藏'收集的集合,以便不能直接调用它(当我可能忘记也手动设置dateCollected时)。
澄清一下,让我沮丧的部分是'@dynamic'电话 - 我不知道这些应该在哪里生活。
编辑 - 我想我错过了一部分。我可以将@property声明移动到实现文件中。但我希望隐藏二传手,并让吸气者保持公开。我想我需要替换@property,但我不知道如何为核心数据对象做这个。
答案 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通过不要求即时变量出现在任何地方来清理它。