2012-04-23 4 views
1

Похоже, каждый раз, когда нам нужно инициализировать объект, мы должны немедленно написатьВ Objective-C есть более короткий способ написать метод init?

-(id) init { 
    self = [super init]; 
    if (self) { 
     // initialize values here 
    } 
    return self; 
} 

это есть более короткий путь, чтобы сделать это? Может быть, даже макросом?

+3

очень короткий и простой уже. – Raptor

+0

Почему вы не добавляете фрагмент кода в сам Xcode? Проверьте [здесь] (http://www.tuaw.com/2011/07/05/dev-juice-how-do-i-autocomplete-in-xcode-4/) – Ilanchezhian

+0

coz Я думаю, что в Ruby вы просто печатаете 'super', а затем следующая строка вы запускаете код инициализации, и это все ... очень короткий ... –

ответ

3

Вы можете уйти с одной линией меньше, но это и не рекомендуется больше:

- (id) init { 

    if((self = [super init])){ 
     // initialize ivars 
    } 
    return self; 
} 

Boilerplate является шаблонный, к сожалению, и каждая из вещей, которые Инициализаторы сделать: присваивают self к результату [super init] (или назначенный инициализатор суперкласса), проверка self не nil, инициализация ivars и возврат self (nil или действительный объект) являются необходимыми.

Чтобы избавиться от некоторого ввода, вы можете сделать фрагмент кода в Xcode.

+0

+1 для фрагмента кода. Если вы собираетесь лениться, не наказывайте других разработчиков. – endy

+0

Знаете ли вы, почему это не рекомендуется? coz это совершенно прекрасное использование (по крайней мере, в прежние времена) ... это будет ... другой разработчик неправильно читает его как 'if (self == [super init])' или даже "редактировать его, чтобы сделать он правильный "... и измените' = 'на' == ' –

+0

@Jeremy: я думаю, что« рекомендуемая практика »может быть слишком сильной фразой. Возможно, я должен был сказать «больше не мода». http://stackoverflow.com/q/4940366/ Есть несколько (я могу думать о трех с головы) о разных, одинаково правильных, способах написания инициализаторов, которые по-разному были «так, как это делается» годы существования Cocoa (и, вероятно, NeXT до этого). –

2

Нет, вы должны выполнить все эти операции в назначенном инициализаторе, чтобы не было простого сочетания клавиш.

Теоретически вы можете перейти по маршруту макроса, но макрос не будет красивым, и он будет нелогичным для читателей вашего кода.

#define BEGIN_INIT self=[super init];if(self){ 
#define END_INIT }return self 

-(id) init { 
    BEGIN_INIT; 
    // initialize values here 
    END_INIT; 
} 

Этот код не намного короче, и он намного менее знаком другим. Я настоятельно рекомендую его снова.

+1

Действительно, не делайте этого. Это делает код менее читаемым в обмен на ... uh ... удаление двух строк кода после класса – Chuck

Смежные вопросы