Как стать автором
Обновить

Комментарии 30

Вы это серьезно на счет макросов?.. facepalm.jpg

1. Пишите код, выделяете его и перетаскиваете в окошечко справа, предварительно выбрав там CodeSnippets



2. Задаете параметры для вашего сниппета



3.…

4. Profit!!1
Полезно, спасибо. Но макросы могут быть удобнее в других задачах.
Вот именно что в других!
Выбранный вами подход значит постоянное повторение кода.
Макросы же решают одну задачу все время одинаково в рамках одного проекта.
Сниппеты позволяют мне не тратить время на многочисленные drawRect, layoutSubviews и т.п., при чем во всех проектах, а макросы нужно подключать во все проекты, подключать хедеры, в общем кучу лишних телодвижений, ради того чтобы кагбы упростить себе жизнь.
Я считаю что подход с макросами имеет место быть, но вариант со сниппетами более гибкий и удобный.
все-таки когда можно обойтись макросом или функцией — это лучше сгенеренного кода. Менять потом проще.
[array objectAtIndex:0] => array[0];
array[0] = @«5»;

Вот эта штука (и для nsdictionary тоже) будет работать начиная в ios 6+

Плюс, категорически не согласен с заменой типов, какая-то Java получилась. Остальное ок.
Вот эта штука (и для nsdictionary тоже) будет работать начиная в ios 6+

Нет. Будет работать и в младших версиях.
Нет, не будет. Читайте во что оно транслируется компилятором и смотрите с какой версии iOS эти методы доступны.
Нет, будет. Просто проверьте.
Хм. Сработало. Когда смотрел доки, сразу полез в хедеры увидел, что objectAtIndexedSubscript: доступен с 6.0. Проверять не стал, зря.

Признаю неправоту. Другой вопрос — есть ли у этого добра минимальная версия? Или оно при невозможности вызова objectAtIndexedSubscript вызывает objectAtIndex?
Я пробовал на 4.3 на железе — также работает. Видимо, при указании низшего target транслируется в другой код.
Вот ответ. В случае, если в проекте используется ARC, приведенный метот будет работать в 4.3+. В противном случае, можно классы допилить категориями или руками слинковать arclite.

Рекомендую дополнить статью.
Да ну нет же :)
Проект у меня как раз без ARC, и там все работает
Сдаюсь :)
НЛО прилетело и опубликовало эту надпись здесь
Да, меня смутило, что на сайте clang'а написано, что транслируется оно objectAtIndexedSubscript:, который доступен только в iOS 6+.
НЛО прилетело и опубликовало эту надпись здесь
Не забывайте, что параметрами макросов могут быть выражения, поэтому в самих макросах надо их оборачивать в скобки.

Например, в этом макросе:
#define RGB(r, g, b)   [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1.0]

если я вызову его так:
RGB(shift+r, shift+g, shift+b)

получится черт-те-что.

Поэтому, надо переписать его так (обратите внимание, что colorWithRed:green:blue:alpha: принимает не double, а CGFloat):
#define RGB(r, g, b)   [UIColor colorWithRed:(r)/255.f green:(g)/255.f blue:(b)/255.f alpha:1.f]

Ну, и, с остальными макросами та же беда.
Ну и есть еще одна проблема, если передать в макрос что-то типа i++, а макрос наш кривой и подставит эту переменную два раза, то на выходе будет совсем не то чего мы хотели. Для того чтобы этого избежать, нужно создавать локальные переменные, и задавать им переданные макросу значения.
Ну, такую проблему можно решить, например, так (NSObjCRuntime.h):
#define MIN(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a<__b ? __a : __b; })

#define MAX(A,B) ({ __typeof__(A) __a = (A); __typeof__(B) __b = (B); __a<__b ? __b : __a; })
Именно, просто лень было искать этот код)
Имхо, вместо ViewWidth ViewHeight гораздо удобнее категории:

— (CGFloat)width
{
return self.size.width;
}

— (void)setWidth:(CGFloat)width
{
CGRect newFrame = self.frame;
newFrame.size.width = width;
self.frame = newFrame;
}

— (CGFloat)height
{
return self.size.height;
}

— (void)setHeight:(CGFloat)height
{
CGRect newFrame = self.frame;
newFrame.size.height = height;
self.frame = newFrame;

}


И т.п.
Я все свои вспомогательные штуки собрал в github.com/pilot34/P34Utils, может кому-то еще что-то удобно будет позаимствовать. Поключается как CocoaPod.
Ага, и каждый новый девелопер, вынужденный работать с Вашим кодом, будет обязан выучить макросы. И это я еще не говорю о возможных name conflicts из-за имен макросов и переопределений типов без префиксов.
И да, иногда utility-методы все же нужны, и лучше имхо их делать inline-функциями. Как минимум это дает проверку типов на этапе компиляции и лучшую читаемость, чем макросы (особенно если макросы многострочные).
Когда они упростят уже [NSString stringWithFormat:@«sound%d.mp3», pageNumber];
до чего-то типа @{"%d",pageNumber}? (Уж не знаю как лучше скобки ставить в данном примере)
Идеально было бы как в ruby

str = "sound#{page_number}.mp3"
#define SPRINTF(format, args...) [NSString stringWithFormat:(format), args]

NSString *str = SPRINTF(@"%@ %.2f [%d]", @"string", 3.1415f , 2*3*7);
NSLog(@"%@", str);

string 3.14 [42]
Спасибо!
Т.к. меня упомянули в самом посте, пришлось в README.markdown примеры написать, совесть заела :)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории