2012-04-26 4 views
4

позвольте мне начать с того, что я довольно новичок во всей структуре и союзе. я сделал свою домашнюю работу, прежде чем публиковать это и честно пытаюсь получить законное разъяснение. если это неправильный способ, пожалуйста, дайте мне знать. Во-первых, я пытаюсь создать объединение, потому что я объединяю разные типы данных. моя единственная реальная проблема/вопрос - это точечный оператор vs ->. я могу получить то, что я хочу работать, используяцель-c союз "->" против "."

-> 

но не

. 

им просто любопытно, почему? iv прочитайте кучу сообщений в стеке, которые показывают примеры или «ответы», используя «.», но не повезло в реальном мире. я играл с «typedef», как ...

typedef union _myUnion 
{ 
    int intValue; 
    bool boolValue; 
}myUnion; 

но это не шов, чтобы изменить ситуацию. если кто-нибудь объяснит, что я делаю неправильно, это будет очень признательно. вот краткий пример того, что я пытаюсь сделать. для простоты я просто опубликую синтаксис struct/union и не добавлю какой-либо код подкласса, поскольку это не проблема.

example.h

#import "<Foundation/Foundation.h" 

union myUnion 
{ 
    int intValue; 
    bool boolValue; 
}; 

@interface MyClass : NSObject 
{ 
    union myUnion *someProperty; 
} 

@property (nonatomic, assign) union myUnion *someProperty; 

-(void)doSomething; 

@end 

example.m

#import "MyClass.h" 

@implementation MyClass 

@synthesize someProperty = _someProperty; 

- (id)init 
{ 
//Some init method... 
} 

- (void)doSomething 
{ 
    NSLog(@"I Did Something..."); 
} 

@end 

так что теперь в моем другом классе это работает ...

MyClass *newObject = [MyClass alloc] init]; 
newObject.someProperty->intValue = 6; 

, но это не ...

MyClass *newObject = [MyClass alloc] init]; 
newObject.someProperty.intValue = 6; 

на данный момент я больше заинтересован в том, чтобы узнать, почему этот последний не работает? что интересно, если я сниму указатель в файле .h для свойства.

@interface MyClass : NSObject 
    { 
     union myUnion someProperty; 
    } 

@property (nonatomic, assign) union myUnion someProperty; 

"." работает вместо «->», но теперь его нельзя назначить.

как побочная заметка, если я изменю bool на int и сделаю это структурой, то же самое произойдет. к сожалению, я стал опытным в объективе-с первым, и я медленно подбираю строгую c как я иду. поэтому мое понимание c немного слабое, но это красота obc, я получаю возможность изучать два языка по цене одного! если вы не считаете open-gl.

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

ответ

4

В этом случае, вполне вероятно, что вы хотите, чтобы союз в качестве значения - не указатель на внешнюю ячейку памяти:

@interface MyClass : NSObject 
{ 
    union myUnion someProperty; // << no '*' 
} 

@end 

тогда вы используете период для доступа к члену:

someProperty.intValue = 6; 

и если бы указатель:

someProperty->intValue = 6; 

Однако есть еще одна проблема. У вас есть два (первичных) варианта использования объединения как свойства. Значение или указатель. Это обычно обрабатывается значением, особенно когда все поля относятся к локальной памяти к структуре/объединению, а когда идентификатор поля невелик. В этом случае вы часто возвращаетесь и устанавливаете значение. Это означает, что ваша программа будет записана следующим образом:

@interface MyClass : NSObject 
{ 
    union myUnion someProperty; 
} 

@property (nonatomic, assign) union myUnion someProperty; // << by value 

@end 

, то клиент может получить доступ и установить его значение, например, так:

union myUnion p = obj.someProperty; 
++p.intValue; 
obj.someProperty = p; 

, и вот как это часто осуществляется с небольшими структурами которые не относятся к общим ресурсам.

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

- (void)doSomething 
{ 
    ++someProperty.intValue; 
} 

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

+0

ответы, предоставленные Вами и тимофеевка удивительно заявил. Спасибо вам обоим. если бы я мог задать следующий вопрос. давайте создадим вездесущий класс «человек». что «человек» обладает свойством «волос». что волосы имеют «длину» и «цвет». поэтому, если бы я хотел установить person.hair.цвет = черный; & person.hair.length = long; была бы правильная дорога, или я должен смотреть на это по-другому? я думаю, я пытаюсь выяснить, как создать «вспомогательные свойства», затем установить и получить их. – DoS

+0

@DoS для нетривиального поведения и данных, вы обычно просто используете класс objc, а не просто c struct или union. с опытом, вы сможете легко выбрать класс objc, c struct или другой подходящий дизайн. – justin

+0

Еще раз спасибо за информацию. но к вашему моменту я просто пытаюсь изучить различные методологии для того, чтобы делать что-то. «расширять мои горизонты», так сказать. Я знаю, что могу сделать это с чистым классом o-c, но было любопытно, как еще это можно сделать. я думаю, я все еще немного запутался в вопросе или синтаксисе псевдо-«свойства». используя пример класса «человек», вы в основном говорите, что «волосы» будут просто подклассом класса «человек». «длина» и «цвет» будут тогда просто свойствами подкласса волос? Я правильно понимаю это? – DoS

7

Оператор a->b является сокращением на (*a).b - это как с использованием ., но в первую очередь разыгрывает. Это подходит, когда a является указателем.

Поскольку в вашем исходном примере someProperty является указателем на объединение, вам нужно будет разыменовать этот указатель первым. Это означает, что вам необходимо либо использовать:

(*newObject.someProperty).intValue // confusing! 

Или

newObject.someProperty->intValue // much better 

для доступа к нему.

Конечно, после того, как вы изменили someProperty как союз вместо указателя на объединение, вы можете использовать вместо него .. Итак:

  • a->b: Обращается член структуры/объединения на указатель
  • a.b: Обращается элемент структуры/объединения на сырьевой структуры/союз