不使用if做出决定

时间:2014-05-12 18:42:57

标签: ios objective-c cocoa osx-mavericks

我有这样的代码:

MyClass *object = [self nextValidObject];

如果没有要返回的新对象或下一个可用的对象,方法nextValidObject将返回nil。

之后我有一个值,我必须从数组中获取,比如

NSArray *myArray = @[@"aaa", @"bbb"];

如果object为nil,我想获取“aaa”,如果不是,则我想获取“bbb”。

我知道,我可以这样做:

NSString *myString = object ? @"aaa" : @"bbb";

NSString *myString = object ? myArray[0] : myArray[1];

但我正在考虑像

这样的事情
NSString *myString = myArray[ ... some magic here ... ];

通过一些魔法我想知道是否有一种方法可以施放(我不知道这是不是正确的单词)0到nil和1到nil,所以我可以在那里使用对象。

6 个答案:

答案 0 :(得分:1)

如果你不想分支,你可以这样做:

NSString *myString = myArray[(NSUInteger)ceil((double)(intptr_t)(__bridge void *)object / ((double)(intptr_t)(__bridge void *)object + 1))];

可能有一种比这更好的方法,但我现在无法思考。它显示了这个想法。

实际上,考虑到这一点,以下内容将起作用并且更具可读性:

myArray[(intptr_t)(__bridge void *)object && 1];

分支并不是那么糟糕,除非有特殊原因要避免分支。

答案 1 :(得分:1)

虽然

中有明确的if - 子句
NSArray myString = object ? @"aaa" : @"bbb";

被称为ternary operator,它在许多编程语言中是if子句的“捷径”。你可以使用强制转换:

NSObject *object = nil; 
int i = (int)(object || 0); // i = 0 
// if object is not nil i = 1

但我不建议在软件开发中使用它。 if-clauses的使用和帮助是有原因的。 :-)我不明白你为什么要避免if-clauses。

答案 2 :(得分:0)

不知道你为什么要这样做,但你可以去

int i = 1;
NSString *myString;
do {
    myString = myArray[i--];
} while (object && i >= 0);

没有if .. ..

答案 3 :(得分:0)

试试这个:

NSString *myString = myArray[ (nextValidObject ? 1 : 0) ];

与你正在做的事情并没有什么不同,但至少决定发生在方括号内,正如你似乎想要的那样。不是魔术,但这可能是我写的......

答案 4 :(得分:0)

Objective-C是C,在C中,关系和相等运算符返回一个整数值 - 1如果条件为真,0如果为假。所以表达式:

object != nil
如果对象不是1,则

的值为nil,如果对象不是0则为{{1}}。没有比这更复杂的了。

答案 5 :(得分:-1)

您有NSArray *myArray = @[@"aaa", @"bbb"];

当对象为零时,你想要myArray [1],等于“bbb”。

伪代码:

if object equal nil
    index := 1
else
    index := 0
myString := myArray[index]

目标C:

NSInteger index = (object != nil);
NSString *myString = [myArray objectAtIndex:index];