Naming parameters 命名参数

你可以用圆括号、冒号和空格来给方法添加参数,最后的效果可能和 Swift 里面是一样的,但是 Objective-C 的语法不那么友好。

我们还是先从简单的例子讲起,在这个例子里面,我们先给方法添加单个参数,把这段代码放到 Person.m 文件里:

- (void)printGreeting:(NSString*)greeting {
    NSLog(@"%@", greeting);
}

你也要在 Person.h 文件里修改一下代码:

- (void)printGreeting:(NSString*)greeting;

不难发现 Person.h 文件里的声明,就是把这个方法的第一行照搬了过来,然后在后面加一个分号。

注意啦,引入头文件这个事情,在面的文章里我就不提醒你了哟,要记得自己 import 它。

当我们要在 main.m 文件里调用新方法的时候,要这样写:

Person *person = [Person new];
[person printGreeting:@"Welcome!"];

可以发现第一个参数变成了方法名称的一部分,这一点有时候会让这个方法名有点怪怪的,比如说这个 dismissViewControllerAnimated。

我们再写一个新方法,根据不同人的名字,来向他们打招呼,代码可以这样写:

- (void)printGreetingTo:(NSString*)name {
    NSLog(@"Hello, %@", name);
}

那如果我们想要两个及以上的参数,我们经常会用 "and", "with", "at"这一些小介词来命名,比如说这个例子:

- (void)printGreetingTo:(NSString*)name atTimeOfDay:(NSString*)time {
    if ([time isEqualToString:@"morning"]) {
        NSLog(@"Good morning, %@", name);
    } else {
        NSLog(@"Good evening, %@", name);
    }
}

我们可以这样调用:

[person printGreetingTo:@"Taylor!" atTimeOfDay:@"evening"];

到这一步,"print greeting to Taylor at time of day evening." 这个结果,其实也不难写。但是这个语法,写起来相当的繁琐,我们来仔细的看一看方法名:

- (void)printGreetingTo:(NSString*)name atTimeOfDay:(NSString*)time;

第二个参数前面有一个额外的提示 atTimeOfDay,当我们调用这个方法的时候,也要再写一遍这个提示。它后面有一个分号,就像返回值的写法一样。最后的 time 才是这个参数真正的名字,才是真正在这个方法里面用到的。

这种写法我们管它叫做「命名参数」(named parameter), 这个和 Swift 里的写法是一样的。第一个参数后面的参数和它的写法是不一样的。你可以不给第一个参数起名字,但是,后面的每一个参数都需要给他们取一个名字。

如果你曾经做过 iOS 开发的话,你就看到过在某些方法里面,相同的对象会用不同的方法名称,比如说在 UITableViewDataSource 协议里面就可以看到这些方法:

- (UITableViewCell *)tableView:(UITableView *)tableView
cellForRowAtIndexPath:(NSIndexPath *)indexPath
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
- (NSString *)tableView:(UITableView *)tableView
titleForHeaderInSection:(NSInteger)section
- (NSString *)tableView:(UITableView *)tableView
titleForFooterInSection:(NSInteger)section
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

前四个方法的构成是一样的,首先,是一个表格视图(table view),然后是一个长长的参数名字。比如说 cellForRowAtIndexPath。正是因为有了这一些参数,我们才能区分开这些选择器究竟是做什么的。

但最后一个方法 numberOfSectionsInTableView 就是一个例外了,他和前面的完全不一样。这是因为前面的选择器,比如 cellForRowAtIndexPath,他有两个参数。但是 numberOfSectionsInTableView 里面,就只有这一个参数,没有别的了。

results matching ""

    No results matching ""