Objective c 目标-c代码等于guard

Objective c 目标-c代码等于guard,objective-c,swift2,Objective C,Swift2,我一直在objective-c中实现home kit应用程序。我已经转换了所有的swift代码,但在一行代码处停了下来 guard let metadata = metadata else { return false } 请任何人指导我写与上述代码行等效的objective-c代码。非常感谢你阅读我的帖子 它是: if (metadata == nil){ return false; } 从编译器的角度来看,没有确切的等价物,因为保证guard语句else块返回控制(即

我一直在objective-c中实现home kit应用程序。我已经转换了所有的swift代码,但在一行代码处停了下来

guard let metadata = metadata else { return false }
请任何人指导我写与上述代码行等效的objective-c代码。非常感谢你阅读我的帖子

它是:

 if (metadata == nil){
       return false;
  }

从编译器的角度来看,没有确切的等价物,因为保证guard语句else块返回控制(即guard语句必须为true,代码才能继续通过guard)。你可以

你能得到的最接近的是:

if(metadata == nil) { return NO; }

Objective-C中没有
guard
等效物

最接近的方法是:

if (metadata == nil) {
    return NO;
}
…但有一个限制,
元数据
必须是对象类型(即类);它不能是结构或C标量(例如,
NSUInteger
)。

您可以使用Objective-C++中的“let”定义,定义如下:

#define let const auto
要仅将Objective-C类转换为Objective-C++,需要将扩展名.m更改为.mm

//Similar to "guard" in Swift
let object = myObject;
if (!object) {
    return;
}

//Other use case
if (let object = myObject) {
    //Object is not nil
    //Do something
}

最简单的方法是反转“guard”条件,并使用一个简单的if语句退出,如下所示:

if (!metadata) { return NO; }
当然,Obj-C编译器不会像swift编译器那样提醒您必须退出

可以#定义一个“guard”宏,该宏将自动反转条件并在执行某些参数后返回,但在不事先知道返回值的类型的情况下,以通用方式编写这样的宏可能会很棘手

#define GUARD(CONDITION,DO_BEFORE_EXIT) { if (!(CONDITION)) { DO_BEFORE_EXIT; return; }
稍后,在代码中:

GUARD(metaData!=nil, NSLog(@"ouch, nil metaData! exiting!");)
但还有另一种老技术,还有另一个好处——在退出之前统一处理“最终”代码,这就是:

-(void)myMethod {
  do {
    if (metadata==nil) break;

    // do something

    if (somethingelsefailed) break;

    // do something else
    // until done.

  while (false);
  NSLog(@"here put your final handling");
  return;
};

我在C和Objective-C代码中发现了比Swift guards更有用的东西。

Oops!如果,则在
之后忘记了
()
。最近做得太快了!对于单行,大括号在Objective-C中是可选的。但不管怎样,把它们包括进去也没什么坏处。当你添加第二行时,缺少花括号可能会再次咬到你,这是不太可能的。我总是用花括号作为一种风格。我只是对您的第一条评论进行了评论,因为在本例中缺少大括号实际上并不正确。我所说的是封装测试条件的
()
,而不是封装满足条件时执行的语句的
{}
。我忘了在我的答案的第一个版本中包括这些!您忘记了
返回
行后的分号。如果是
BOOL
类型,则应返回
NO
,而不是
false