Синтаксис цели c - PullRequest
       3

Синтаксис цели c

0 голосов
/ 28 октября 2011

Я новичок в программировании на Objective-C. Во многих уроках я видел код этого формата:

[[classname function] function];

Например:

[[NSString alloc] initwithformat:parameters];

Когда я изучал plist и словари, я увидел следующую строку кода:

[[self.objname objectAtIndex:indexPath.row] objectForKey:@"somename"];

Я полагаю, что это соответствует синтаксису: [[objectname function] function]

Может кто-нибудь объяснить, как работает этот синтаксис, и разницу между первым и вторым примером.

Также было бы очень полезно, если бы вы могли предоставить эквивалентные операторы в C или Java для этих примеров.

Ответы [ 7 ]

6 голосов
/ 28 октября 2011

[ClassName methodName] - это способ вызова метода класса.Эквивалент в Java это Classname.methodName();

[object methodName], как вы вызываете нормальный метод экземпляра.Эквивалент в Java: object.methodName();

В Objective C вы также можете 'вкладывать' вызовы в [] скобки.[[Classname method1] method2] эквивалентно вызову метода класса method1, который возвращает некоторый объект, и затем вызывает method2 для этого объекта.

Эквивалентом в Java будет Classname.method1().method2();

Также обратите внимание, что в строгой терминологии Objective C вы не «вызываете метод объекта», вы «отправляете сообщение объекту'вместо.То же самое, разные слова.

1 голос
/ 28 октября 2011

Это просто сокращенная запись, которая позволяет избежать создания временных переменных или объектов. Вы можете вложить столько их, сколько хотите, но вы должны держать код читабельным.

например. если у вас есть массив строк, которые являются именами изображений, чтобы получить изображение, вы можете сделать это:

NSString *imageName = [imageArray objectAtIndex:0];
UIImage *image = [UIImage imageNamed:imageName];

Если вы хотите обойтись без переменной NSString, вы можете написать:

UIImage *image = [UIImage imageNamed:[imageArray onjectAtIndex:0]];

Очистить

0 голосов
/ 28 октября 2011

Я предполагаю, что ваша путаница связана с точечной нотацией, поскольку это часто сбивает с толку новых разработчиков.Это было неудобное и недавнее дополнение к языку.Я также предполагаю, что правки mkb верны, поскольку ваш исходный код был недопустим.

Этот вызов:

[[self.objname objectAtIndex:indexPath.row] objectForKey:@"somename"];

Точно такой же, как этот вызов:

[[[self objname] objectAtIndex:[indexPath row]] objectForKey:@"somename"];

Это грубый, вероятно, эквивалент в языке, подобном C ++, будет следующим:

this.objname.objectAtIndex(indexPath.row).objectForKey("somename");

Это грубая эквивалентность, потому что ObjC и C ++ имеют разные подходы к тому, как называются методы, но в большинстве случаевбыло бы то же самое.

Вас может заинтересовать Обучение какао с другими фонами .Я также настоятельно рекомендую Язык программирования Objective-C в качестве начала или основательную книгу по этому вопросу.Objective-C сильно отличается от Java и C ++, и, по моему опыту, попытка подобрать его по ходу приведет к значительному замешательству и разочарованию позже.Лучше всего изучать язык в его собственных терминах, а не пытаться понять, «как мне сделать эту вещь C ++ в ObjC?»В половине случаев ответ таков: нет.

0 голосов
/ 28 октября 2011

Обычно квадратные скобки означают, что вы отправляете сообщение объекту.Если сообщение возвращает значение, которое также является объектом, вы также можете отправить этому объекту сообщение.Внутреннее сообщение вашего первого примера отправляет сообщение alloc объекту класса NSString.Это возвращает указатель на выделенный объект типа NSString.Затем сообщение initWithFormat: инициализирует содержимое строки.

В Java это будет выглядеть примерно так:

public class NSString {
  public static NSString alloc() {
    return new byte[<size of a string>];
  }
  public void initWithParameters(Map<String, String> params) {
    /* initialize */
  }
}

и в каком-то другом файле:

NSString str = NSString.alloc().initWithParameters(params);

, но объектная модель Java не совсем такая же, как Objective-C, так что это только приближение.

0 голосов
/ 28 октября 2011

. Формат - это сокращение для метода get. Так, например, если объект person имеет возраст, и у вас есть определенный или синтезированный метод getAge, вы можете вызвать [person getAge] или person.age и получить эквивалентные результаты.

0 голосов
/ 28 октября 2011

Хорошо, обо всем по порядку.Вариант [[obj method1] method2] отправляет сообщение method1 на obj, а затем отправляет сообщение method2 с возвращаемым значением [obj method1].

Второй пример, [[self.objname objectAtIndex:indexPath.row] objectForKey:@"somename"], немного большесложный.self.objname - это доступ к свойству objname объекта self (self всегда ссылается на собственный экземпляр объекта).Таким образом, с [self.objname objectAtIndex:indexPath.row] сообщение objectAtIndex отправляется объекту, возвращенному self.objname, с параметром indexPath.row.indexPath опять же является объектом, и вы получаете доступ к свойству row.И на то возвращаемое значение вы отправляете сообщение objectForKey с параметром @"somename".И @ "str" ​​- это встроенный синтаксис для строк target-c.

HTH

0 голосов
/ 28 октября 2011

[self.objname objectAtIndex: indexPath.row] objectForKey: @ "somename"]; в основном делает это:

В массиве есть словарь (массив - objname), и вы выбираете словарь с помощью objectAtIndex. Затем словарь содержит количество ключей и значений для этих ключей. Вы выбираете значение с помощью objectForKey: id.

Несколько более простой синтаксис был бы:

 NSDictionary *dict = [objname objectAtIndex:indexPath.row];
 NSLog(@"%@", [dict objectForKey@"key"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...