Разочарован кодом Objective-c
Ну, я начал с iPod/iPhone программирования с использованием Head First iPhone Development (O'reilly) и набираю код из книги. Есть две проблемы, одна связана с программированием, а другая нет.
Я не понимаю формат методов target-c. Сейчас я получаю несколько ошибок на основе исходного кода из книги. Что приводит меня к моей следующей проблеме.
Часть кода глючит. Я так думаю, потому что я не мог заставить код работать без его изменения. У книги есть некоторые опечатки в тексте, так как это первое издание и так далее, но может ли мое "исправление" кода быть с этим связано?
Итак... Где я могу узнать больше о методах target-c и о том, как они работают с точки зрения структуры и куда идут возвращаемый тип и аргументы?
Для тех, кто с книгой, я в середине приложения InstaTweet к началу.
Благодарю.
6 ответов
Возможно, было бы полезно сравнить между "c-like" языком и obj-c - давайте пойдем с Java. Представьте себе класс Rectangle с методом setBackgroundColor. Предположим, у нас есть экземпляр Rectangle с именем rect.
В Java сигнатура метода, скорее всего, будет
public void setBackgroundColor(int r, int g, int b) { ... }
В Objective-C аргументы являются частью сигнатуры метода, поэтому это может быть
- (void)setBackgroundColorWithRed:(int)r green:(int)g blue:(int)b;
"-" означает, что это метод экземпляра в классе Rectangle. (void) - тип возвращаемого значения метода. Тогда приходят аргументы. Каждое двоеточие определяет аргумент, который вводится (каждый аргумент (int) в этом примере).
Давайте сравним вызов этих методов. Джава:
rect.setBackgroundColor(255, 255, 0);
Obj-C:
[rect setBackgroundColorWithRed:255 green:255 blue:0];
Многие люди натыкаются на синтаксис obj-c - вы не одиноки. Надеюсь, это сравнение прояснит ситуацию. Это также иллюстрирует лингвистическую силу target-c: во время вызова ясно, каковы ваши аргументы. Если бы я читал код и видел вызываемый метод Java, не было бы очевидно, что аргументы бывают красного, синего и зеленого цвета. В obj-c до боли ясно, что мы устанавливаем индивидуальные значения цвета. Конечно, большинство разработчиков могут догадаться, каковы три аргумента метода setColor, но более сложные методы приводят в замешательство. Вот более сложный метод, определенный в Java и target-c:
static Dog createDog( String name
, int age
, boolean isNeutered
, String ownerName
);
+ (Dog *)createDogNamed:(NSString *)name
age: (int) age
neutered:(BOOL) isNeutered
owner: (NSString *) owner;
Во время разговора:
Dog.createDog("Fluffy", 2, true, "Moshe");
[Dog createDogNamed:@"Fluffy" age:2 neutered:YES owner:@"Moshe"];
Objective-c более многословен, но гораздо более читабелен. В примере с Java не совсем понятно, что означают аргументы "2" и "true". Objective-c почти читает как английский.
Другие люди разместили ссылки на более подробные руководства, но я надеюсь, что это поможет вам преодолеть синтаксические камни преткновения, чтобы сделать ссылки полезными. Я рад ответить на более конкретные вопросы, которые у вас есть. По моему опыту, новичкам в obj-c действительно тяжело с синтаксисом, а затем они нажимают s и чувствуют себя великолепно. Повесить там!
Ознакомьтесь с введением Apple в цель C.
Основной формат метода
-(ReturnType *)methodName:(VariableType *)variableName{
}
Например:
-(NSString *)giveMeANewStringFromAnOldString:(NSString *)oldString{
}
Вы также должны проверить сайт книги на предмет ошибок.
Определение метода Objective-C довольно просто. На самом деле это очень похоже на обычное определение вызова функции C. Большим дополнением является возможность именования параметров. Вот пример:
-(int)addX:(int)x toY:(int)y
{
return x + y;
}
Что вы можете использовать, отправив сообщение на соответствующий объект:
int z = [object addX:x toY:y];
В этом случае я дал параметрам и аргументам одинаковые имена, чтобы было понятно, как все устроено. Вы можете так же легко сделать:
int z = [object addX:4 toY:7];
И после этого, z
будет 11
Я сделал то же самое, что и ты. Я также взял книгу Head First для разработчиков iPhone (в комплекте 3.1 SDK).
Я просмотрел все учебники и обнаружил только одну ошибку, из-за которой мое приложение не работало (я сделал это в своей книге, но сейчас не могу найти его...).
После этого я понял, что у меня точно такая же проблема, как и у вас с синтаксисом.
Я взял "Программирование в Objective-C 2.0" Стивена Г. Кочана. (Это просто блестяще.) Книга ясна и лаконична. Я даже не прошел через 25% книги, и на все мои вопросы ответили.
Чтение кода на объекте C потратило на меня месяцы, потому что я настолько привык к другому синтаксису, что моему мозгу потребовалось немного времени, чтобы приспособиться к тому, что ожидает объект C.
Я обнаружил, что код Objective-C становится действительно читабельным после того, как вы обернетесь вокруг него. Приведенный выше пример Карла Норума - отличная демонстрация читабельности.
[object addX:4 toY:7];
Это не становится намного более читабельным, чем это!
Также некоторая терминология немного отличается. "Передача сообщения об объекте" против "вызова метода" меня тоже отбросила на несколько недель.
Я надеюсь, что рекомендация книги поможет вам, она действительно помогла мне много.
Прочитайте Программирование Какао (R) для Mac(R) OS X (3-е издание), это Библия для Mac и Какао.
У меня не было никаких проблем с этим, но имейте в виду, что API всегда движется вперед, поэтому могут быть небольшие обновления / изменения. Но я не нашел ничего, что помешало бы мне закончить все примеры кода и упражнения.
Это книга для чтения.
Есть несколько отличных учебных ресурсов от Apple:
Цель обучения C: Учебник для начинающих
а также
Руководство по кодированию для какао
Удачи!