У меня есть контроллер, который зарегистрирован как наблюдатель для LOT свойств на представлениях. Это наш -observeValueForKeyPath::::
метод:Как я могу оптимизировать этот огромный if/else if block в пределах наблюденияValueForKey
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void*)context
{
if(context == kStrokeColorWellChangedContext)
{
[self setValue:[change objectForKey:NSKeyValueChangeNewKey] forKey:kStrokeColorProperty];
}
else if(context == kFillColorWellChangedContext)
{
[self setValue:[change objectForKey:NSKeyValueChangeNewKey] forKey:kFillColorProperty];
}
else if(context == kBodyStyleNumChangedContext)
{
[self setValue:[change objectForKey:NSKeyValueChangeNewKey] forKey:kBodyStyleNumProperty];
}
else if(context == kStyleChangedContext)
{
[self setValue:[change objectForKey:NSKeyValueChangeNewKey] forKey:kStyleProperty];
}
else if(context == kStepStyleChangedContext)
{
[self setValue:[change objectForKey:NSKeyValueChangeNewKey] forKey:kStepStyleProperty];
}
else if(context == kFirstHeadStyleChangedContext)
{
[self setValue:[change objectForKey:NSKeyValueChangeNewKey] forKey:kFirstHeadStyleProperty];
}
else if(context == kSecondHeadStyleChangedContext)
{
[self setValue:[change objectForKey:NSKeyValueChangeNewKey] forKey:kSecondHeadStyleProperty];
}
И есть на самом деле о 3x больше этих else if
заявлений.
Одна вещь, которую вы можете видеть, состоит в том, что каждый блок имеет тот же код, что заставляет меня думать, что можно оптимизировать это.
Моя первая мысль была иметь NSDictionary
называется keyPathForContextDictionary
, где ключи константы с Context
суффиксом (типа void*
), а значения соответствующих строковых констант, обозначаемые суффиксом Property
Тогда это метод потребуется только одну строки:
[self setValue:[change objectForKey:NSKeyValueChangeNewKey] forKey:keyPathForContextDictionary[context]];
Обратите внимание, что мне нужно использовать структуру данных некоторого вида, чтобы определить, какие использовать ключевой путь, и я не могу просто использовать keyPath
аргумент, передаваемый в метод , Это связано с тем, что есть несколько видов, которые имеют то же свойство, что и у меня (например, цветные лунки имеют свойство color
). Поэтому каждому виду необходимо определить уникальный ключевой путь, который в настоящее время определяется исходя из контекста
Проблема заключается в том, что вы не можете использовать void*
как ключи в NSDictionary
. Итак ... у кого-нибудь есть рекомендации по тому, что я могу здесь сделать?
EDIT: Вот пример того, как константы определены:
void * const kStrokeColorWellChangedContext = (void*)&kStrokeColorWellChangedContext;
void * const kFillColorWellChangedContext = (void*)&kFillColorWellChangedContext;
void * const kBodyStyleNumChangedContext = (void*)&kBodyStyleNumChangedContext;
void * const kStyleChangedContext = (void*)&kStyleChangedContext;
NSString *const kStrokeColorProperty = @"strokeColor";
NSString *const kFillColorProperty = @"fillColor";
NSString *const kShadowProperty = @"shadow";
NSString *const kBodyStyleNumProperty = @"bodyStyleNum";
NSString *const kStyleProperty = @"style";
Тип аргумента 'context' является' недействительным * ' так что вы можете использовать любой тип, который вам нужен. Вы можете изменить его как объект - вам просто нужно его бросить. Каковы типы всех констант 'k $ THINGYColorWellChangedContext'? –
Извините, позвольте мне отредактировать сообщение. Но суффикс 'context' означает' void * ', а суффикс' property' обозначает 'NSString *' –
Покажите объявление одной из этих констант, пожалуйста. –