Objective c 目标-c代码等于guard
我一直在objective-c中实现home kit应用程序。我已经转换了所有的swift代码,但在一行代码处停了下来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块返回控制(即
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
。