我收到错误控件可能会在此代码上达到非空函数的结尾:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (changeData.selectedSegmentIndex == 0) {
return self.tweets.count;
} else if (changeData.selectedSegmentIndex == 1) {
return self.tweets1.count;
} else if (changeData.selectedSegmentIndex == 2) {
return self.tweets2.count;
}
}
为什么?
答案 0 :(得分:6)
因为当您的所有if
条件失败时,您不会从函数返回任何内容。
函数中的多个return语句也不是一个好习惯。
这样做:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
int count = 0;
if (changeData.selectedSegmentIndex == 0)
{
count = self.tweets.count;
}
elset if (changeData.selectedSegmentIndex == 1)
{
count = self.tweets1.count;
}
else if (changeData.selectedSegmentIndex == 2)
{
count = self.tweets2.count;
}
return count;
}
答案 1 :(得分:2)
Midhun MP有你的答案和更好的代码风格。我强烈建议用switch-statement替换所有那些嵌套的else-ifs,好吧你真的不想要其他if-ifs如果你可以避免它们......
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
NSInteger count = 0;
switch (changeData.selectedSegmentIndex)
{
case 0:
count = self.tweets.count;
break;
case 1:
count = self.tweets1.count;
break;
case 2:
count = self.tweets2.count;
break;
default:
break;
}
return count;
}
答案 2 :(得分:2)
答案 3 :(得分:0)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSInteger count = 0;
if (changeData.selectedSegmentIndex == 0) {
count = self.tweets.count;
} else if (changeData.selectedSegmentIndex == 1) {
count = self.tweets1.count;
} else {
count = self.tweets2.count;
}
return count;
}
或
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
NSInteger count = 0;
if (changeData.selectedSegmentIndex == 0) {
count = self.tweets.count;
} else if (changeData.selectedSegmentIndex == 1) {
count = self.tweets1.count;
}
else if (changeData.selectedSegmentIndex == 2){
count = self.tweets2.count;
}
return count;
}
答案 4 :(得分:0)
虽然我同意大多数答案,这些答案建议在一般情况下避免多个return
,但有时候多个return
很好且很有用。例如,调度enum
:
#include <iostream>
#include <string>
enum direction { north, east, south, west };
std::string to_string(direction d)
{
switch (d)
{
#define CASE(C) case C: return #C
CASE(north);
CASE(east);
CASE(south);
CASE(west);
#undef CASE
}
}
int main()
{
std::cout << to_string(west) << '\n';
}
如果你用GCC编译,你会得到(C或C ++,它是相同的):
$ g++-4.9 -Wall foo.cc
foo.cc: In function 'std::string to_string(direction)':
foo.cc:17:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
Clang没有抱怨。实际上,这并不是那么好,因为它也会在没有警告的情况下编译它:
int main()
{
std::cout << to_string(direction(666)) << '\n';
}
导致:
$ clang++-3.5 -Wall foo.cc
$ ./a.out
zsh: illegal hardware instruction ./a.out
所以必须&#34;战斗&#34;海湾合作委员会的警告。一个错误的方法是添加说法
default: abort();
到switch
。当然,它可以治愈症状,但现在GCC将不再抱怨如果我添加一个新的direction
,比如zenith
,但忘记在to_string
中覆盖它。实际上,在打开枚举时从不使用默认情况。
然后你可以在<{em} abort
之后留下switch
(这是笨拙的,不使用内部return
)。