在目标c中,为什么或如何将参数放在前面

时间:2013-06-18 00:18:50

标签: ios objective-c uitableview

我在UITableViewDataSource协议中查看如下消息:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

并且从未完全理解为什么tableView部分位于开头(这是消息的名称还是一个参数)。看起来应该是:

- (NSInteger)numberOfRowsInSection:(NSInteger)section 
                      withTableView:(UITableView *)tableView 

tableView:(UITableView *)tableView代表什么?它被列为一个参数,但它似乎应该在最后?我在这里错过了什么?它应该怎么读?

thx任何帮助

3 个答案:

答案 0 :(得分:4)

Objective-C方法名称与大多数语言略有不同,因为方法的参数通常是方法名称的一部分。

您将该方法名称读为“tableView:numberOfRowsInSection:”。它在方法体中需要两个称为“section”和“tableView”的参数。

表视图对象是首先列出还是最后列出是一个风格问题,但由于它是此消息的“主题”,因此首先列出它是有意义的; Objective-C风格强调可读性,因此这个方法几乎可以读作句子:“表格视图在给定的部分中有 x 行数。”

答案 1 :(得分:2)

在Objective-C中,方法名称与参数交错。所以这个:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

和此:

- (NSInteger)numberOfRowsInSection:(NSInteger)section withTableView:(UITableView *)tableView;

在某种意义上是等价的,可以用来实现相同的最终目标,它们是不可互换的。第一个方法的名称(即发送以调用它的消息)是tableView:numberOfRowsInSection:,而第二个方法是numberOfRowsInSection:withTableView:。正如mipadi所提到的,Objective-C方法通常应该像普通英语一样可读。如果您调用方法numberOfRowsInSection:ofTableView:,我会认为这是一个好名字。无论出于何种原因,首先设计API的人都不会选择。

完全拥有tableView参数的原因是,如果您有多个tableView都具有相同的dataSource对象,则可以确定正在询问哪个 tableView。

在这种特定情况下,我认为tableView作为第一个参数的原因是使它更接近OS X上的NSTableView API以及Cocoa中的其他委托方法,其中 long 早于iOS和UITableView。为什么决定让tableView在NSTableView的API中排在第一位,这在历史上是失败的,但同样,这就是Apple(实际上是NeXT)设计它的方式。

答案 2 :(得分:1)

将调用源放在开头是委托方法的常见模式。拥有此参数很重要,因为单个对象可以是多个视图的委托(或者在本例中是数据源),并且需要该参数来知道代表哪个委托方法调用哪个视图。无论是第一个还是最后一个都是武断的,没有技术意义。