【问题标题】:Error Control reaches end of non-void function错误控制到达非空函数的末尾
【发布时间】:2014-11-25 09:57:10
【问题描述】:

当我们尝试运行游戏时,出现错误。

-(id)initWithSize:(CGSize)size {
    self.physicsWorld.contactDelegate = self;

    self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(0, 72, self.frame.size.width, self.frame.size.height -72)];
    self.physicsBody.categoryBitMask = FCBoundaryCategory;
    self.physicsBody.contactTestBitMask = FCPlayerCategory;

    _gameState = FCGameStateStarting;
    _score = 0;
}

【问题讨论】:

  • 这是objective-c,我不太熟悉,但我猜它和c或c++中的一样:你缺少return声明。
  • 我建议阅读有关指定初始化程序的内容。您缺少典型 init 方法的其他重要部分。

标签: objective-c


【解决方案1】:

您的方法的返回类型为id,因此它必须返回一个值。您可能错过了方法末尾的 return self; 行。

【讨论】:

  • 这是一个init 方法。它需要做的不仅仅是添加return
【解决方案2】:

编译器会打印错误,因为您没有返回 id(对象引用),但该方法被声明为返回 id。但是这种方法还有其他几个问题。

init 方法必须调用super init 方法,将超级调用的结果赋值给self,检查它不是nil,并返回self。此外,现代风格是将 init 方法的返回类型声明为instancetype。因此:

- (instancetype)initWithSize:(CGSize)size {
    if (self = [super initWithSize:size]) {
        self.physicsWorld.contactDelegate = self;

        self.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(0, 72, self.frame.size.width, self.frame.size.height -72)];
        self.physicsBody.categoryBitMask = FCBoundaryCategory;
        self.physicsBody.contactTestBitMask = FCPlayerCategory;

        _gameState = FCGameStateStarting;
        _score = 0;
    }
    return self;
}

阅读 Cocoa Core Competencies: Initialization 中的初始化程序。

【讨论】:

  • 仅供参考 - 我建议更改 if 语句的两种方式之一。在if 语句中使用= 是很危险的(当== 是指时,这是一个常见的错字)。 1) 使用一组额外的括号或 2) 分成两行。选项 #2 似乎是 Apple 最新的首选方法。
  • 我写的方式是一个常见的成语。如此常见,以至于 clang 有一个特殊情况警告它。
  • 这也是我链接的文档中使用的语法。
  • 除非我想到不同的警告,否则它需要使用额外的括号来避免在条件中使用赋值的警告。
  • -Wparentheses 警告警告条件中的分配(除非分配有额外的括号),但有一个特殊情况不会警告这种对自我的分配。你需要-Widiomatic-parentheses 来警告这种情况。请参阅SemaExpr.cpp 中的Sema::DiagnoseAssignmentAsCondition
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
相关资源
最近更新 更多