Установка свойств анонимно созданных объектов в Objective C

если у меня есть метод / функция в OBJ-C, которая возвращает объект. Я часто использую:

    return [[MyEventArgs alloc] init];

// Также нужно установить свойство MyEventArgs Height равным 100.

Если бы я хотел задать какие-то свойства этому объекту при его создании. Как мне это сделать? В C # я могу:

return new MyEventArgs{Height = 100};

Каков синтаксис для этого в OBJ-C?

Другой вопрос по той же теме: могу ли я динамически создавать объекты и свойства в OBJ-C, как в C #?

например, я могу сделать это на C # (отличная функция при работе со ссылкой / лямбда)

 List<object> aList = new List<object>();
 aList.Add(new { Height = 100 });

Как мне сделать это в OBJ-C?

//Заранее спасибо!


person Objective Coder    schedule 04.11.2011    source источник


Ответы (2)


В Objective-C нет такого сокращения. Вам нужно было бы назвать переменную каким-то образом, чтобы вызвать для нее соответствующие методы.

person Joshua Weinberg    schedule 04.11.2011
comment
Ни один из двух приведенных выше примеров не может быть выполнен в Obj-C? Это как-то странно. Я обнаружил, что очень хочу это делать. И лишний синтаксис меня действительно раздражает. Однако спасибо за ответ! - person Objective Coder; 04.11.2011
comment
Вы можете создать несколько макросов C, которые помогут. Или есть сокращение инициализации, как в первом примере для структур C, но не для полных объектов. - person Joshua Weinberg; 04.11.2011
comment
Это не совсем верно, OP нужен собственный метод инициализации, единственное, что вы НЕ МОЖЕТЕ сделать, это решить, какие свойства устанавливать или нет, но вы можете создавать собственные методы инициализации (или удобные методы, такие как ответ Евгения) - person Simon Lee; 04.11.2011
comment
Саймон: Это две разные проблемы. Идея заключалась в том, что ему нужно было сокращение, не создавая новый инициализатор для каждого набора. Аналогично инициализации структуры C CGPoint p = {.x = 1.0f, .y = 2.0f} - person Joshua Weinberg; 04.11.2011
comment
Исходя из фона .NET, я точно знаю, что он хочет сделать, но ответ о том, чтобы создать и объект, а затем вызвать некоторые методы доступа, не особо решает его проблему, если он ВСЕГДА хочет установить высоту объекта при установке, тогда почему бы не поместить его в специальный метод инициализации, вы не предложили ему такого объяснения. - person Simon Lee; 04.11.2011
comment
да. Я понимаю концепцию создания метода initWithHeight для этого примера. Но это был всего лишь пример. Допустим, у меня есть много классов со многими свойствами, и мне нужно создавать из них объекты и помещать их, например, в массив, я просто хочу иметь возможность напрямую устанавливать свойства объектов. А что касается моего второго примера, который, как мне кажется, еще хуже, поскольку цель c не позволяет, действительно удобно иметь возможность создавать анонимные объекты с динамически создаваемыми экземплярами свойств на лету. e.i при извлечении свойств из базы данных и создании из них настраиваемых объектов. - person Objective Coder; 04.11.2011
comment
@ObjectiveCoder: вы МОЖЕТЕ сделать свой второй пример, просто не добавив кое-что для тяжелой работы (или просто используйте NSDictionary) - person Joshua Weinberg; 04.11.2011

Таких сокращений нет, но вы, например, можете создать собственный конструктор, например

+ (id)myObjectWithHeight:(CGFloat)height;

Код конструктора будет:

+ (id)myObjectWithHeight:(CGFloat)height {
  MyObject *object = [[[MyObject alloc] init] autorelease];
  object.height = height;
  return object;
}

И используйте это как

NSArray *array = [NSArray arrayWithObject:[MyObject myObjectWithHeight:100]];
person Eugene    schedule 04.11.2011
comment
да. Конечно, я мог это сделать. Или просто определите собственный конструктор инициализации. Но я не этого хотел. - person Objective Coder; 04.11.2011