кратчайший способ передать список BOOL-ов методу в objective-c?

#objective-c #nsarray #boolean

#objective-c #nsarray #логическое

Вопрос:

Какой самый короткий способ передать список BOOL-ов методу в objective-c? (т. Е. без необходимости настраивать записи в NSArray, используя NSNumber для их переноса).

Справочная информация: Я хочу много раз вызывать тестовый метод в модульном тестировании, поэтому мне нужен сокращенный способ эффективно сказать:

 [myCustomObject compareWithBools:[TRUE, FALSE, TRUE, TRUE, TRUE]]
  

В получающем методе «compareWithBools» я могу вставить строки кода для возврата, чтобы иметь возможность сравнивать, однако мне просто нужна была хорошая короткая строка в тестах, которые я могу вызвать…

Ответ №1:

этот подход довольно прост

 - (NSComparisonResult)compareWithBools:(BOOL*)bools /* << a pointer to an array of BOOLs, which is owned by the caller */
                                 count:(NSUInteger)count; /* << the number of elements in @a bools */
  

Комментарии:

1. Это должно было быть моим предложением. Помните, что Obj-C является надмножеством C, а BOOL — это просто целое число. Таким образом, передать массив BOOLs на C легко.

2. извините, не совсем понял — вы хотите сказать, что здесь нужно как-то написать пользовательский метод? compareWithBools — это не существующий метод, не так ли?

3. @Greg правильно, и нет, это не существующий метод (о котором я знаю). основываясь на формулировке OP, я понял, что это было вашим намерением. я добавил NSComparisonResult в качестве возвращаемого типа, потому что compareWith...: методы обычно возвращают результат сравнения.

Ответ №2:

Передайте целое число и сравните отдельные биты этого целого:

 [myCustomObject compareWithBools:13]; // which will be a sequence of 1011
  

Комментарии:

1. о :), это действительно коротко — я вроде как хотел иметь возможность более легко видеть значения — есть ли способ сделать в базе 2? например, «compareWithBools: 1011»?

2. Вы могли бы написать макрос BIN2INT(10011)

3. по макросу это просто #define, на который вы ссылаетесь, тогда Eimantas?

4. да, я имею в виду define. Либо это, либо простая статическая функция тоже будет работать.

Ответ №3:

Пропустить NSNumber оболочку с макросом?

 #define Greg_BOOLFromNSString(s) ([(s) isEqualToString:@"YES"])

[myCustomObject compareWithStrings:[NSArray arrayWithObjects:@"YES", @"NO", @"YES", @"YES", @"YES", nil]];
  

Комментарии:

1. это выглядит довольно неплохо, Джош — возможно, было бы разумно добавить Greg_BOOLFromNSString с использованием categories в качестве метода расширения для NSString?

2. Отмечен как ответ, отмечая компактность последней строки и тот факт, что она очень удобочитаема, несмотря на компактность.

3. @Greg: да, вы, безусловно, могли бы сделать это методом вместо макроса; хотя этот способ позволяет избежать несколько избыточного вызова метода.