Избавляемся от строковых констант в Objective-C

Магические константы в коде — зло. Строковые константы в коде — еще большее зло. И вроде бы от них никуда не денешься, они повсюду: 1) При загрузке объектов из xib-ов: MyView* view = [[[NSBundle mainBundle] loadNibNamed:@«MyView» owner: self options: nil] lastObject]; MyViewController* controller = [MyViewController initWithNibName:@«MyViewController» bundle: nil]; 2) При работе с CoreData: NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:[NSEntityDescription entityForName:@«MyCoreDataClass» inManagedObjectContext: moc]]; [request setSortDescriptors:@[ [[NSSortDescriptor alloc] initWithKey:@«someProperty» ascending: NO] ]]; 3) Если вы используете KVO, то строки появляются и тут:[self addObserver: someObservedObject forKeyPath:@«someProperty» options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context: nil]; 4) Ну и KVC: NSInteger maxValue = [[arrayOfMyClassObjects valueForKeyPath:@»@max.someProperty»] intValue]; 5) Но даже если CoreData вы предпочитаете работу с SQLite напраямую, xib-ами вы брезгуете, то вот такой код вам должен быть знаком:[self.tableView dequeueReusableCellWithIdentifier:@«MyTableViewCell»]; 6) Ну и когда Apple представила миру Storyboard — это было замечательно, если-бы не одно но:[self performSegueWithIdentifier:@«MySegue» sender: nil]-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqual:@«MySegue»]); } Вы видите проблему? Она состоит в том, что компилятор никак не проверяет содержимое строк, поскольку не знает (да и не может в принципе знать), что в них содержится. И если вы опечатаетесь или измените значение соответствующих полей в xcdatamodel / xib / storyboard / переименуете property, то ошибка вылезет не на стадии компиляции, а в рантайме, и отловить и исправить ее будет дольше и дороже. Так что-же можно сделать? Читать дальше →

© Habrahabr.ru