我有这样的代码:
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,所以我可以在那里使用对象。
答案 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];