Какао Objective-c Свойство C структура присваивает неудачу - PullRequest
10 голосов
/ 11 марта 2010

Я хочу изменить значение переменной, которая является членом структуры другого класса. Но значение не меняется.

Вот код.

//Structure..

typedef struct {
    int a;
    double b;
} SomeType;


//Class which has the structure as member..
@interface Test2 : NSObject {
    // Define some class which uses SomeType
    SomeType member;

}

@property SomeType member;

@end


@implementation Test2

@synthesize member;

@end


//Tester file, here value is changed..
@implementation TesstAppDelegate

@synthesize window;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // Insert code here to initialize your application 

    Test2 *t = [[Test2 alloc]init];

    t.member.a = 10;
//After this the value still shows 0

}

@end

Я попробовал по ссылке ниже.

Структура как член класса в Цели C

С уважением, Dhana.

Ответы [ 3 ]

22 голосов
/ 11 марта 2010

Чтобы внести изменения в переменную вашего экземпляра 'member', вам нужно установить ее полностью. Вы должны сделать что-то вроде:

SomeType mem = t.member;
mem.a = 10;
t.member = mem;

Проблема в том, что t.member используется в качестве "получателя" (поскольку за ним сразу не следует '='), поэтому t.member.a = 10; совпадает с [t member].a = 10;

Это ничего не даст, потому что [t member] возвращает структуру, которая является "r-значением", т.е. значение, которое допустимо только для использования в правой части назначения. У него есть значение, но пытаться изменить это значение бессмысленно.

По сути, t.member возвращает копию вашей структуры 'member'. Затем вы немедленно изменяете эту копию, и в конце метода эта копия отбрасывается.

4 голосов
/ 17 апреля 2011

Вместо этого создайте указатель на вашу структуру, а затем просто разыменуйте ее, если вы хотите изменить ее часть.

Пример:

struct myStruct {
    int a,
        b;
};

@interface myClass : NSObject {
myStruct *testStruct;
}

@property myStruct *testStruct;

Затем, чтобы изменить часть myStruct, просто сделайте myClassObject.testStruct->a = 55;

1 голос
/ 04 ноября 2013

Измените строку синтеза на:

@synthesize member = _member;

Затем вы можете присвоить значения в одной строке кода:

_member.a = 10;

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