3

我收到错误 Control may reach end of non-void function on this code:

- (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;
    }
}

为什么?

4

5 回答 5

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;
}
于 2013-11-09T11:02:48.597 回答
2

Midhun MP 有你的答案和更好的代码风格。我强烈建议用 switch 语句替换所有嵌套的 else-ifs,因为如果你能避免它们,你真的不想要 else-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;
}
于 2013-11-09T11:10:34.090 回答
2

如果您认为可以禁用它:

在此处输入图像描述

于 2016-09-01T15:05:24.343 回答
0

虽然我同意大多数建议return在一般情况下避免使用多个 s 的答案,但有时 multiple returns 是好的和有用的。例如在 an 上调度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

因此,必须“对抗” GCC 的警告。一种错误的方法是添加说

default:  abort();

switch. 当然,它治愈了症状,但是现在如果我添加一个新的 GCC 将不再抱怨direction,例如zenith,但忘记将它覆盖在to_string. 所以真的,在打开 enum 时永远不要使用默认情况

然后你可以在theabort 之后留下一个switch(如果不使用 inner returns 会很笨拙)。

于 2014-10-07T13:29:27.120 回答
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;
   }
于 2013-11-09T11:03:23.070 回答