#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: да, вы, безусловно, могли бы сделать это методом вместо макроса; хотя этот способ позволяет избежать несколько избыточного вызова метода.