Мінімалізм Objective-C

Я часто пишу невеликі тестові проекти на Objective-C, щоб поекспериментувати або погратися з чим-небудь. Зазвичай, я розміщую код в main.m і позбавляюся від всього іншого:

#!/usr/bin/env objc-run
@import Foundation;

@implementation Hello : NSObject
- (void) sayHelloTo:name
{
printf("Hello %s my address is %p\n", [name UTF8String], self);
}
@end

int main ()
{
id hello = [Hello new];
[hello sayHelloTo:@"sunshine"];
}


Це повноцінний проект з одного файлу, готовий до виконання. Під катом — опис прийомів, що дозволили прийти до даного мінімалізму.

  • Все пишеться в main.m. Або “Test.m", або що завгодно. Функція main() може знаходитися в будь-якому файлі.
  • Використовуємо objc-run. Якщо ви ще не стикалися з нею, objc-run — прекрасна утиліта, яка дозволяє легко використовувати файли Objective-C як консольних скрипто-подібних завдань". Встановіть її:
    brew install objc-run
    
    і додайте права на виконання вихідного файлу:
    chmod u+x main.m
  • Модулі замість предкомпиленных заголовків. Можливо, є сенс в #imports і PCH у великих проектах, але для маленьких тестових програм? Ні вже.
  • Жодних оголошень
    @interface
    Я випадково дізнався, що ObjC дозволяє вказувати суперклас прямо в директиві
    @implementation
    . Не зовсім зрозуміло, з якою метою це допущено, але це дозволяє повністю позбутися від блоку
    @interface
    .
  • Неявні типи параметрів функцій. Повертаються типи і параметри методів ObjC неявно рівні (id), що означає
    (id)doSomethingWith:(id)param
    ; це абсолютно те ж саме, що і
    doSomethingWith:param
    ; але другий варіант виглядає зручніше.
  • Жодних аргументів в main(). Хоча це вважається поганою практикою, цілком допустимо писати
    void main ()
    замість
    int main (int argc, char**argv)
    . Навіщо це все оголошувати, якщо ви все одно не користуєтеся цими аргументами?
  • Позбавляємося від
    return
    на
    main()
    .
    Починаючи зі стандарту C99, при поверненні управління від
    main()
    без оператора повернення — вважається, що було викликано
    return 0;
  • printf замість NSLog. NSLog — для повідомлень про помилки, а не для виводу тексту — мені не потрібно виводити шлях до виконуваного файлу і ID потоку на кожній сходинці.


Примітка перекладача: при відсутності
@interface
мене дратує висновок warning:
/dev/fd/63:3:17: warning: cannot find interface declaration for 'Hello'
@implementation Hello : NSObject
^
1 warning generated.

Це
warn_undef_interface
, для якого немає відповідного прапора-W (для заглушення попереджень за типами). Так що для себе я залишив порожній інтерфейс.

#!/usr/bin/env objc-run
@import Foundation;

@interface Hello : NSObject
@end

@implementation Hello
- (void) sayHelloTo:name
{
printf("Hello %s my address is %p\n", [name UTF8String], self);
}
@end

int main ()
{
id hello = [Hello new];
[hello sayHelloTo:@"sunshine"];
}


image

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.