我怎么可以创建一个方法在@执行一类而不界定它在@接口?

例如,我有一个构造,做了一些初始和然后读取的数据文件。我想要因素出的文件阅读码成一个单独的方法,然后,我呼吁从内部构造。我不想要界定这一方法在标题,因为它是私人的,只要这@执行情况的上下文。

这可能吗?

这里是我的实例。我有一个小的程序,阅读是一个Todo任务的列表的文件。

这里是@的界面:

@interface TDTaskList : NSObject {
  NSString* name; // The name of this list.
  NSMutableArray* tasks;  // The set of tasks in this list.
}

-(id)initListOfName:(NSString*)aName;
-(NSArray*)loadListWithName:(NSString*)aName;

@end

和这里的一部分@的执行情况:

-(id)initListOfName:(NSString*)aName {
  if (self = [super init]) {
    name = aName;

    NSArray* aTasks = [self loadListWithName:aName];
    tasks = [NSMutableArray arrayWithArray:aTasks];
  }

  return self;
}

-(NSArray*)loadListWithName:(NSString*)aName {
  // TODO This is a STUB till i figure out how to read/write from a file ...

  TDTask* task1 = [[TDTask alloc] initWithLabel:@"Get the Milk."];
  TDTask* task2 = [[TDTask alloc] initWithLabel:@"Do some homework."];

  return [NSArray arrayWithObjects:task1, task2, nil];
}

什么我想要做的是 必须下定义的界面:

-(NSArray*)loadListWithName:(NSString*)aName;
有帮助吗?

解决方案

如果你把一个方法实施前调用它的任何代码,你不需要在标题中定义它。

因此,在这种情况下,放 loadListWithName:在 initListOfName的前在@implementation块,这将是很好的

注意:仅仅因为它不是在标题中定义并不意味着该方法不能被代码之外的对象调用。目标C不具有私有方法。

其他提示

安迪暗示的意见,可以使用 扩展 (看起来像一个类别,没有一名)。不同的是你 必须 执行该声明的方法在扩展而编译器不验证是否实现声明的方法中的一个类别。

.h:

@interface MyObject : NSObject
{
    NSNumber *number;
}
- (NSNumber *)number;
@end

.m:

@interface MyObject ()
- (void)setNumber:(NSNumber *)newNumber;
@end

@implementation MyObject

- (NSNumber *)number
{
    return number;
}
- (void)setNumber:(NSNumber *)newNumber
{
    number = newNumber;
}
@end

您可以使用类别的:

// In TDTaskList.m
@interface TDTaskList(TDTaskListPrivate)
-(id)initListOfName:(NSString*)aName;
-(NSArray*)loadListWithName:(NSString*)aName;
@end

@implementation TDTaskList(TDTaskListPrivate)

// implementation of initListOfName and loadListWithName ...

@end

你有两个合理的选择。两者基本上已经描述过,但恕我直言,有点不清楚,甚至完全错误。

类别不是其中之一,因为据我所知,它们用于将实现分解为多个源文件的完全不同的目的。

  • 按照上述 Nathan 的描述进行操作。尽管他的最后一个假设(私有方法)是错误的。
  • 使用私有方法扩展定义来允许前向引用,如下所示:

    1. 从标头中完全删除 loadListWithName 的定义
    2. 将以下内容添加到源代码 (.m) 中 @implementation 块之前
    @interface TDTaskList (PrivateMethods)
    -(NSArray*)loadListWithName:(NSString*)aName;
    @end
    
    @implementation ...
    

  • 许可以下: CC-BY-SA归因
    不隶属于 StackOverflow
    scroll top