Использование executeSelector: для доступа к свойству BOOL

Я использую performSelector:, который возвращает id объект, чтобы вызвать несколько других методов. Тип возвращаемого значения этих методов может быть BOOL, int, NSDate или любой другой вид объекта.

Как я могу выяснить, вернулся ли объект с performSelector: это BOOL или нет? Я пытался преобразовать его в NSNumber и такое, но это падает, если объект не является BOOL,

У меня есть класс с такими атрибутами, как эти:

@property(retain,nonatomic) NSString* A;
@property(assign,nonatomic) BOOL B;
@property(retain,nonatomic) NSArray* C;
@property(assign,nonatomic) int64_t D;

Этот класс генерируется фреймворком, поэтому я не могу его изменить. Но я хочу перебрать A, B, C, D вызывать каждый атрибут и извлекать данные. Однако, как вы можете видеть, тип возвращаемого значения может варьироваться, и мне нужно приспособиться к нему.

Я делаю что-то похожее на:

SEL s = NSSelectorFromString(@"A");
id obj = [object performSelector:s];
//check if obj is BOOL
//do something with obj

1 ответ

Если все, что вам нужно сделать, это получить значения различных свойств, используйте кодирование ключ-значение, которое автоматически оборачивает скалярные типы, такие как int а также BOOL в случаях NSNumber, Так что все, что вам нужно, это строка вроде следующего:

id value = [object valueForKey:@"somePropertyName"];

В противном случае вы могли бы заранее проверить тип возвращаемого значения, вызвав methodSignatureForSelector: на целевом объекте, но это кажется кучей ненужной работы, учитывая ситуацию, которую вы описали.

Другие вопросы по тегам