我一直在Objective-c中实现家庭套件应用程序。我已经转换了所有swift代码但是停在一行名为
guard let metadata = metadata else { return false }
请有人指导我编写与上面代码行相当的objective-c代码。非常感谢您阅读我的帖子。
答案 0 :(得分:5)
从编译器的角度来看,没有确切的等价物,因为保证语句else块保证返回控制(即,保护语句必须为true才能使代码继续通过保护)。你可以read more about it here。
最接近的是:
if(metadata == nil) { return NO; }
答案 1 :(得分:2)
它的:
@ones = [3, 3, 5, 4, 4, 3, 5, 5, 4]
@teens = [6, 6, 8, 8, 7, 7, 9, 9, 8] #without "ten"
@tens = [6, 6, 6, 5, 5, 7, 6, 6] #also without "ten"
@hundred = 7
@hundred_and = 10
@one_thousand = 11
def sum_array(array)
array.inject { |sum, n| sum + n }
end
def one_to_nineteen
sum_array(@ones) + sum_array(@teens) + 3 #ten
end
def sum_tens
sum = 0
@tens.each { |x| sum += sum_array(@ones) + (x * 10) } #0-9
return sum
end
def one_to_ninety_nine
return one_to_nineteen + sum_tens
end
def sum_hundreds
sum = 0
@ones.each do |x|
sum += (x + @hundred) + ((x + @hundred_and) * one_to_ninety_nine) + one_to_ninety_nine
end
return sum
end
def one_to_one_thousand
print one_to_ninety_nine + sum_hundreds + @one_thousand
end
one_to_one_thousand
答案 2 :(得分:1)
Objective-C中没有guard
等效项。
最接近的是:
if (metadata == nil) {
return NO;
}
...但是metadata
必须是对象类型(即类)的限制;它不能是结构或C标量(例如,NSUInteger
)。
答案 3 :(得分:0)
您可以使用" let"定义在Objective-C ++中定义:
#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
}
答案 4 :(得分:0)
最简单的方法是反转“后卫”条件,并使用简单的if语句退出,如下所示:
if (!metadata) { return NO; }
当然,Obj-C编译器不会像swift编译器那样提醒您必须退出那里。
可以#define一个'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防护更有用。