Да.
Во-первых, как вы заметили, вся документация написана для Objective-C, который является совершенно другим языком.
Одно отличие заключается в имени метода. В Objective-C, когда вы отправляете сообщение (Python сказал бы «вызов метода») объекта, имя метода (селектор) и аргументы смешиваются:
NSURL *URL = /*…*/;
NSError *error = nil;
QTMovie *movie = [QTMovie movieWithURL:URL
error:&error];
Это невозможно в Python. Ключевые аргументы Python не считаются частью имени метода, поэтому, если вы сделали это:
movie = QTMovie.movieWithURL(URL, error = ???)
вы получите исключение, потому что класс QTMovie не имеет метода с именем movieWithURL
; сообщение в примере Objective C использует селектор movieWithURL:error:
. movieWithURL:
и movieWithURL
будут двумя другими селекторами.
Они никак не могут это изменить, потому что аргументы ключевых слов в Python не упорядочены. Предположим, у вас есть гипотетический метод с тремя аргументами:
foo = Foo.foo(fred, bar=bar, baz=baz)
Теперь это вызывает foo:bar:baz:
, верно?
Не так быстро. Foo также может иметь метод с именем foo:baz:bar:
. Поскольку аргументы ключевых слов Python не упорядочены, возможно, вы вызываете этот метод. Точно так же, если вы попытались позвонить foo:baz:bar:
, вы можете на самом деле позвонить foo:bar:baz:
. В действительности этот случай маловероятен, но если он когда-либо случится, вы не сможете надежно вызвать любой из методов.
Итак, в PyObjC вам нужно вызвать метод, подобный этому:
movie = QTMovie.movieWithURL_error_(URL, ???)
Вам может быть интересно узнать ??? C не допускает множественных возвращаемых значений, поэтому в Objective-C аргумент error:
принимает указатель на переменную-указатель, и метод будет хранить объект в этой переменной (это называется возврат по ссылке). Python не имеет указателей, поэтому способ, которым мост обрабатывает подобные аргументы, заключается в том, что вы передаете None, и метод (кажется, возвращает) кортеж. Итак, правильный пример:
movie, error = QTMovie.movieWithURL_error_(URL, None)
Вы можете видеть, как даже простой пример отличается от того, что документация может показать вам в Objective-C.
Есть и другие проблемы, такие как GIL. Приложения какао станут только более параллельными, и вы захотите в этом разобраться, особенно с такими заманчивыми классами, как NSOperation. И GIL - серьезная ответственность, особенно на многоядерных машинах . Я говорю это как парень из Python (когда не пишу для Какао). Как демонстрирует Дэвид Бизли в этом видео, это холодный, жесткий факт; отрицать это невозможно.
Итак, если бы я собирался переключиться с Objective-C на мои приложения, я бы взял MacRuby . В отличие от PyObjC и RubyCocoa, сообщения объектам Какао не пересекают языковой мост; это базовая реализация Ruby в Какао с языковыми расширениями для лучшей поддержки написания кода Какао.
Но это слишком далеко впереди. Вы только начали. Начните с Objective-C. Лучше избегать всех несоответствий импеданса между языком, который вы используете, и языком, для которого написана документация, сохраняя их на одном языке.
Кроме того, вам будет сложнее диагностировать некоторые ошибки (например, сообщения умершим объектам), не зная, как работает Objective-C. Вы будете писать эти ошибки как новый программист Какао, независимо от того, на каком языке вы пишете код.
Итак, изучите C, затем изучите Objective-C. Знание того и другого не должно занять более нескольких недель, и в конце вы будете лучше подготовлены ко всему остальному.
Я не буду вдаваться в то, как я выучил C; Достаточно сказать, что я не рекомендую, как я это сделал. Я слышал, что эта книга хороша, но я никогда не владел и не читал ее. У меня есть эта книга , и я могу подтвердить, что это хорошо, но это также не для Mac; пропустите главу о том, как скомпилировать код, и вместо этого используйте Xcode.
Что касается Objective-C: Книга Хиллегаса является самой популярной, но я ее не использовал. (Я просмотрел его, и он выглядит хорошо.) Я прочитал документ Apple на языке , а затем сразу же приступил к написанию небольших приложений Какао. Я прочитал некоторые из руководств со смешанными результатами. Существует учебник по конвертации валют , но он мне совсем не помог, и не совсем отражает современное приложение Cocoa. (Современные приложения по-прежнему используют розетки и действия, но также и привязки, а реалистичный конвертер валют - это почти пара привязок.)