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

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

    return [[MyEventArgs alloc] init];

//Също така искам да настроя височината на свойството MyEventArgs да бъде 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 се нуждае, е персонализиран init метод, единственото нещо, което НЕ МОЖЕТЕ да направите, е да решите кои свойства да зададете или не, но можете да създадете персонализирани init методи (или удобни методи като отговора на Eugenes) - person Simon Lee; 04.11.2011
comment
Саймън: Това са два различни проблема. Идеята беше, че той иска стенограма, без да създава нов инициализатор за всеки набор. Подобно на C struct инициализация CGPoint p = {.x = 1.0f, .y = 2.0f} - person Joshua Weinberg; 04.11.2011
comment
Идвайки от .NET фон, знам точно какво иска да направи, но отговорът да се каже да се създаде и обект, след което да се извикат някои методи за достъп, не решава особено проблема му, ако той ВИНАГИ иска да зададе височината на обекта при инсталиране, тогава защо не го поставите в персонализиран init метод, не сте му предложили това обяснение. - 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
да Разбира се, че можех да направя това. Или просто дефинирайте персонализиран init-конструктор. Но не това исках. - person Objective Coder; 04.11.2011