Objective-c代码等于guard

时间:2015-11-13 04:14:56

标签: objective-c swift2

我一直在Objective-c中实现家庭套件应用程序。我已经转换了所有swift代码但是停在一行名为

guard let metadata = metadata else { return false }

请有人指导我编写与上面代码行相当的objective-c代码。非常感谢您阅读我的帖子。

5 个答案:

答案 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防护更有用。