Что предпочтительнее в нотации обозначений Objective-c или квадратной скобки?

Я читаю книгу - Программирование iOS Big Nerd Ranch. В нем говорится, что точечная нотация не рекомендуется, поскольку она запутывает код. Я одновременно смотрю курс Стэнфорда для программирования iOS, и в нем он широко использует точечную нотацию. Чтобы вы посоветовали? Я лично больше склоняюсь к скобкам.

Не могли бы вы объяснить, как скрывать этот код в скобках?

self.display.text = [self.display.text stringByAppendingString:digit];

Как я понимаю, это должно быть:

[[self display] setText]:[[[self display] text] stringByAppendingString:digit];

Правильно ли это?

Ответ 1

Это вопрос личного выбора. Есть те, которые утверждают, что точечная нотация делает непонятным, что сообщения отправляются (методы вызывают), поскольку он выглядит так же, как и элемент структуры структуры C-стиля. Другая сторона аргумента состоит в том, что точечную нотацию легче печатать, читать легче и более кратким.

Как кто-то, кто писал Objective-C, так как до того, как была введена точечная нотация (в Objective-C 2.0), я могу понять аргументы с обеих сторон, но предпочитаю использовать точечную нотацию. Тем не менее, я считаю важным, чтобы люди, начинающие с Objective-C, понимали, что синтаксис точечной нотации преобразуется в стандартные вызовы метода доступа при компиляции. Я думаю, что авторы книги Big Nerd Ranch, вероятно, имеют схожую позицию, и что большая часть того, почему они решили использовать скобки в книге.

Итак, сделайте то, что вам больше нравится. Оба действительны, и выбор между ними по существу является вопросом стиля. Независимо от того, что вы выберете, убедитесь, что вы понимаете, что оба стиля создают эквивалентный скомпилированный код.

EDIT: Я забыл ответить на вопрос о преобразовании точечной нотации в синтаксис скобок. Вы близки, но то, что вы написали, неверно и на самом деле не компилируется. Это должно быть: [[self display] setText:[[[self display] text] stringByAppendingString:digit]]. Если бы я писал это, я бы разделил его на две строки (ну, действительно, я бы использовал точечную нотацию):

NSString *stringWithDigit = [[[self display] text] stringByAppendingString:digit];
[[self display] setText:stringWithDigit];

EDIT 2: Прошло более трех лет с тех пор, как я написал этот ответ. Я просто хотел бы отметить, что в наши дни многие другие классы каркаса Apple имели вещи, которые ранее были обычными методами, преобразованными в @properties (например, -[NSArray count]), предположительно для лучшего взаимодействия Swift. Это заставило меня использовать точечную нотацию еще более либерально, чем раньше.

Ответ 2

Вот мое мнение:

Вы всегда должны использовать точечную нотацию, когда имеете дело со свойствами. Мало того, что быстрее писать (у self.foo меньше символов, чем [short foo]), но что более важно, это упрощает понимание цепочечных сообщений. Например:

self.myTextField.text.length

легче понять, чем

[[[self myTextField] text] length]

Кроме того, это уменьшает вероятность того, что вы испортите пунктуацию (убедитесь, что у вас есть правильное количество скобок, часто это боль).

Но, как заявили другие люди, в конечном итоге это личное мнение.

Ответ 3

Я знаю, что это старый пост, но я бы хотел добавить более современный ответ.

С выпуском быстрой и предстоящей гибели нашего любимого языка предпочтение должно опираться на точечную нотацию. Все фреймворки iOS обновили свой API для поддержки точечной нотации (предпочитая свойства readonly в заголовке для getters). Это делает возможный перевод в сторону более быстрой жидкости.

Чтобы быть понятным, предпочитайте свойства для экземпляров, в которых вы показываете геттеры и/или сеттеры. К счастью, Xcode современный инструмент миграции objective-c сделает для вас большую часть этого.