Массивы Objective-C, стиль и дух - PullRequest
1 голос
/ 08 апреля 2009

Вопрос новичка. Глядя на массивы (то есть: динамический размер) это работает:

NSArray *array;
array = [NSArray arrayWithObjects:
     @"one", @"two", nil];

Это не:

array = [NSArray arrayWithObjects:
     1, 2, nil];

Хорошо, я понял. Это работает:

array = [NSArray arrayWithObjects:
     [NSNumber numberWithInt:1], [NSNumber numberWithInt:2], nil];

Сорт менее "на лету", как C ++ / Java. Я вижу то же самое с примерами init, которые читаю. Например:

// pseudo objc example
MyVar v = [MyVar init];  // blank
[v setSomething];
[v setSomethingElse];
// use v down here

В C ++ / Java я бы сделал:

MyVar v = new MyVar("foo", "bar", "baz", "quux");

И я знаю, что v готов к работе по умолчанию. Есть ли дух ObjC, с которым я не должен бороться? Должен ли я просто написать больше строк и меньше "однострочников"?

Ответы [ 5 ]

4 голосов
/ 08 апреля 2009

В Objective-C метод init является всего лишь методом. В отличие от Java или C ++, чьи конструкторы отличаются от других методов. Таким образом, вы можете определить свои собственные методы init, которые ведут себя как конструкторы C ++ или Java. Например, вы можете определить метод init, который принимает несколько параметров. Это может выглядеть примерно так.

MyVar* v = [[MyVar alloc] initWithName:@"foo" andTitle:@"bar"];
// do something with v
[v release];

Обычная практика - просто создавать новые методы, которые выполняют инициализацию объекта, и префикс имени метода с «init» для ясности и согласованности.

2 голосов
/ 08 апреля 2009

NSArray, его модифицируемый вариант NSMutableArray и все структуры коллекций (NSDictionary, NSSet) предназначены для хранения объектов. Вот почему вы видите [NSNumber numberWithInt:1] вместо простого 1.

Для строк обратите внимание, что строка Objective-c (например, @"one", включая ведущий @) является объектом типа NSString, тогда как строка C (например, "one", без @) имеет вид не объект.

Если вам нужна простота хранения простых значений в массивах, не забывайте, что Objective-C - это расширенный набор C. Это означает, что вы можете использовать объявление вроде:

int array[] = { 1, 2, 3 };
2 голосов
/ 08 апреля 2009

То, что вы получаете с многословием Objective-C, - это большая читабельность.

Конечно, пока вы пишете код, может быть легко что-то наподобие того, что вы написали

MyRect rect = new MyRect(1.0, 1.0, 3.0 3.0);

Но когда вы, или, скорее всего, кто-то еще, придете поддержать ваш код, я бы сказал, что это гораздо легче читать:

MyRect *rect = [[MyRect alloc] initWithX:1.0 Y:1.0 width:3.0 height:3.0];

И в наши дни умных редакторов писать не так сложно.

1 голос
/ 08 апреля 2009

Вы можете написать конструкторы, которые принимают именованные параметры, чтобы поместить его в одну строку:

MyVar *v = [[MyVar alloc] initWithFoo:@"foo" bar:@"bar" baz:@"baz" quux:@"quux"];
0 голосов
/ 08 апреля 2009

Да, Objective-C довольно многословен, так что вам нужно привыкнуть к этому.

Дело MyVar init не совсем верно; вам обычно нужно сделать [[MyVar alloc] init] или [MyVar new]. И во многих случаях есть init варианты, которые принимают аргументы, такие как

MyVar v = [[MyVar alloc] initWithSomething: "foo" somethingElse: "bar"];

Если вы хотите что-то менее многословное, в котором вы можете получить больше однострочников, вы можете рассмотреть MacRuby , который является связующим звеном между Ruby и Objective-C, который дает вам доступ ко всем API-интерфейсы Какао, но с гораздо более компактным синтаксисом высокого уровня (и вы можете стать еще более компактным с HotCocoa . Конечно, при использовании MacRuby есть некоторое снижение производительности, так что если вы В высокопроизводительной игре может оказаться не идеальным написать цикл рисования в RubyCocoa, но он подходит для подавляющего большинства приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...