Я веб-дизайнер/разработчик, который наконец-то решил попробовать свои силы в Objective-C. Я твердо верю в стандарты и придерживаюсь любых руководящих принципов, форматов или неписаных правил, установленных языком, вместо того, чтобы пытаться навязать свое собственное представление о том, как это должно быть сделано, или использовать свои собственные методы (каламбур не предназначен, но я буду смирись с этим). Другими словами, я открыт для написания кода с camelCaseVarNames
или underscore_var_names
; Я просто хотел бы знать, что "общепринято" делается на указанном языке.
В любом случае, я хотел бы знать, как правильно написать метод Objective-C, особенно при расширении существующего класса. И заметьте, я делаю маленькие шаги, поэтому я не беспокоюсь о шаблонах проектирования MVC или любом другом «разделении интересов» прямо сейчас. Я работаю в файле реализации по умолчанию AppDelegate
(да, я крутой). Мне нравится думать, что это эквивалентно написанию набора стилей в <head>
файла HTML при изучении CSS; Я просто пытаюсь понять, что делает эта кнопка и что делает та кнопка. Есть смысл?
Хорошо, вот сценарий. Скажем, вы хотите написать простой метод, который проверяет, принадлежит ли представление к определенному классу. Я уверен, что есть много способов сделать это (и, возможно, каждый NSObject
имеет эту возможность без необходимости в такой функции), но развеселите меня. Вот что у меня получилось (смейтесь):
- (BOOL)viewInstance:(id)view isOfClass(NSString *)className
{
return ( [view class] == NSClassFromString(className) );
}
У меня проблема в том, что viewInstance:
сам по себе довольно бессмысленный, и, судя по тому, что я читал, Objective-Cer любит superRichAndDescriptiveMethodNamesThatAreSelfDocumenting. При этом полное имя метода включает вторую часть — я предполагаю, что вторая часть является именованным аргументом или параметром. Так что, когда читаешь вместе, это на самом деле имеет немного смысла. Реальным примером того, о чем я говорю, является метод colorWithDeviceRed
NSColor
. Я просмотрел список завершения всплывающих окон 20 раз, прежде чем понял, что Red:
был первым параметром! Полная декларация:
+ (NSColor *)colorWithDeviceRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha
Думаю, я просто запутался в том, когда и/или как называть функции определенным образом. Кроме того, меня смущает инициализация объектов. На языках, которые я знаю, я бы создал такой массив:
// JavaScript
var myArray = [ 1, 2, 3 ];
// PHP
$my_array = array( 1, 2, 3 );
// AppleScript
set myArray to { 1, 2, 3 }
// ActionScript
var myArray:Array = new Array( 1, 2, 3 );
// Python
my_array = [ 1, 2, 3 ]
// P.S. I add spaces between brackets because I'm a special boy, so no judgments.
В Objective-C я никогда не знаю, что использовать:
NSArray *myArray = [NSArray new];
NSArray *myArray = [NSArray array];
NSArray *myArray = [[NSArray alloc] init];
NSArray *myArray = [[NSArray alloc] initWithArray:@[1,2,3]];
NSArray *myArray = [NSArray arrayWithArray:@[1,2,3]];
NSArray *myArray = @[1,2,3];
Литерал массива меня меньше всего пугает, потому что он больше всего подходит для других языков. Чего я действительно не понимаю, так это того, как в приведенных выше утверждениях есть метод initWithArray
и метод arrayWithArray
. Хм. Вызывает ли он один и тот же базовый метод?
Меня на самом деле смущает следующее:
[[NSDictionary alloc] initWithDictionary:(NSDictionary)]
[[NSDictionary alloc] initWithDictionary:(NSDictionary) copyItems:(bool)]
Посмотрев на заголовочный файл для NSDictionary, он выглядит как два отдельных метода. Я привык видеть необязательные аргументы, такие как:
function initWithObject(object, copyItems) {
var obj = {};
if ( copyItems ) {
...
}
return obj;
}
В моем примере у меня будет необязательный аргумент, который при включении изменит поток функции. Я, вероятно, совершенно не прав насчет двух методов, но из того немногого, что я знаю о Objective-C, это выглядит так. Тем не менее, я не собираюсь убегать только потому, что я маленький интернет-любитель. Да, немного пугает то, что я могу засыпать темы и писать такие вещи, как NSTerminateNow
, но я думаю, с вашей помощью, ребята, я действительно мог бы кое-чему научиться. Так что, пожалуйста, научите меня!
Мои тексты иногда могут быть немного многословными, так что спасибо, что дочитали до конца.
-[NSColor colorWithDeviceRed:Green:Blue:Alpha:]
и-initWithDictionary:copyItems:
. 19.09.2013[benFlynnReceiverObject sendMessage:@"I'm gettin' the hang of it now. See?"
Еще раз спасибо. 30.09.2013