Objective-C Возможна более короткая запись "если"? - PullRequest
1 голос
/ 01 января 2012

Есть ли способ сократить это утверждение if?

if(objectA != objectD && objectB != objectD && objectC != objectD)

что-то вроде этого псевдокода:

if(objectA && objectB && objectC != objectD)

РЕДАКТИРОВАТЬ:

и что, если я только хочу проверить, если это не NULL?Что-то вроде:

if(objectA != NULL && objectB != NULL && objectC != NULL)

РЕДАКТИРОВАТЬ 2 (извините):

и что, если я только хочу проверить, если это не NSNull?

if(objectA != [NSNull null] && objectB != [NSNull null] && objectC != [NSNull null])

Ответы [ 2 ]

2 голосов
/ 01 января 2012

NULL, nil и 0 являются технически одинаковыми :

С MacTypes.h

#ifndef NULL
#define NULL    __DARWIN_NULL
#endif /* ! NULL */
#ifndef nil
    #define nil NULL
#endif /* ! nil */

И вы можете проверить, что NULL - это некоторая вариация 0, перебирая файлы заголовков, такие как stddef.h.

Таким образом, чтобы убедиться, что все они существуют, просто проверьте на NULL, или, точнее, поскольку это объекты, nil:

if (objectA && objectB && objectC) ...

Но, ИМО, вы не должны этого делать, если вам не нужно действовать на основании того факта, что они nil. Поскольку nil принимает сообщения, часто может быть лучше структурировать ваш код так, чтобы nil мог быть действительным получателем. То есть, если при отправке сообщений этим nil объектам ничего не происходит, проблем не возникает. Другими словами, рассмотрите не использование nil как случай ошибки, а скорее возврат *NSError из API, которые могут дать сбой.

Что касается проблемы NSNull, в частности , я написал пример из , как упростить код с помощью функций с переменными числами . Это позволит вам написать:

if (isNSNull(objectA, objectB, objectC, objectD, nil)) ...

чтобы проверить, все ли объекты == [NSNull null]. Вы также можете использовать похожую технику, чтобы проверить, являются ли они одним и тем же объектом:

if (isEqualTo(objectD, objectA, objectB, objectC, nil)) ...

вернет YES, если A, B и C все == в D.

Суть примера:

// This is just a simple object equality comparator.
static NSComparator compareeq = ^(id obj1, id obj2) {
  if (obj1 == obj2) {
    return (NSComparisonResult)NSOrderedSame;
  }
  return (NSComparisonResult)NSOrderedDescending;
};

// This'll execute the above comparator to compare eq to each object in args
NSComparisonResult comparatorV(NSComparator compare, NSObject *eq, va_list args) {
  NSComparisonResult result;
  NSObject *value;
  do {
    if (value = va_arg(args, NSObject*)) {
      result = compare(eq,value);
    }
  } while (value && result == NSOrderedSame);
  return (!value?NSOrderedDescending:NSOrderedSame);
}

// This just test if each object passed is == [NSNull null].
BOOL isNSNull(NSObject *o, ...) {
  NSNull *n = [NSNull null];
  if (NSOrderedSame != compareeq(n,o)) return NO;
  va_list args;
  va_start(args, o);
  BOOL result = (NSOrderedSame != comparatorV(compareeq,n,args));
  va_end(args);
  return result;
}
0 голосов
/ 02 января 2012

Если вы хотите проверить, равны ли три объекта (a, b и c) объекту D, вы можете сделать следующее:

if (objectA == objectB == objectC == objectD) {
    // .. your code here ..
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...