Фон
Имейте в виду, что свойства на самом деле, по словам , Apple , "синтаксическая стенография для объявления методов доступа класса". Фактически, само по себе объявление @property даже не работает. Ваш оператор @synthesize
переводит @property
в эквивалент двух методов:
- (void)setCrazyObject:(MyObject *)something;
- (MyObject *)crazyObject;
Какой из них использовать, зависит от контекста, окружающего ваш self.crazyObject. (@synthesize
также создает соответствующую переменную экземпляра, если вы сами этого не сделали.) Результат всего этого заключается в том, что вы не можете реально преобразовать свойство в свойство и из него одним единственным методом.
Предлагаемое решение
Вы можете использовать то, что Apple уже предоставляет:
NSString *foo = NSStringFromSelector(@selector(myClassProperty));
Или сделать что-то нестандартное:
Учитывая, что self.crazyObject действительно преобразуется в [self crazyObject]
или [self setCrazyObject:foo]
к тому времени, когда ваш код выполняется, вам, вероятно, понадобятся два метода, например:
- (NSString *)setterStringForProperty:(SEL)prop;
- (NSString *)getterStringForProperty:(SEL)prop;
Затем вы можете использовать как минимум 2 сопутствующих метода, например:
- (SEL)setterForPropertyName:(NSString *)propString;
- (SEL)getterForPropertyName:(NSString *)propString;
В этих методах вы можете использовать функции Foundation NSStringFromSelector
и NSSelectorFromString
для преобразования туда и обратно между SEL и NSString. Используйте любые манипуляции со строками, которые вам нравятся, чтобы конвертировать туда и обратно между вашей сеттерной строкой (setCrazyObject) и именем вашего свойства (crazyObject).
Полное решение сложно предоставить, не зная точного варианта использования, но, надеюсь, это даст некоторые подсказки для тех, кто пытается сделать что-то подобное. Возможно, даже некоторые полезные вещи станут возможными благодаря объединению этого подхода с ответом Оскара.