控制可能会到达非空函数错误if-statement

时间:2013-11-09 11:01:12

标签: ios objective-c xcode uitableview

我收到错误控件可能会在此代码上达到非空函数的结尾:

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

为什么?

5 个答案:

答案 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)

如果你认为它可以禁用它:

enter image description here

答案 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)。