Cocoa Objective-c Свойство структуры свойства C не выполняется
Я хочу изменить значение переменной, которое является членом структуры другого класса.
Но значение не изменяется.
Вот код.
//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
Я попробовал ссылку ниже.
Структура как член класса в Objective C
С уважением,
Dhana.
Ответы
Ответ 1
Чтобы внести изменения в свою переменную экземпляра "member", вам необходимо установить ее целиком. Вы должны сделать что-то вроде:
SomeType mem = t.member;
mem.a = 10;
t.member = mem;
Проблема заключается в том, что t.member
используется как "геттер" (поскольку за ним сразу не следует "=" ), поэтому t.member.a = 10;
совпадает с [t member].a = 10;
Это ничего не выполнит, потому что [t member]
возвращает struct, которая является "r-значением", т.е. значение, действительное только для использования в правой части задания. Он имеет значение, но бессмысленно пытаться изменить это значение.
В принципе, t.member
возвращает копию вашей структуры 'member'. Затем вы немедленно изменяете эту копию и в конце метода отбрасываете копию.
Ответ 2
Вместо этого сделайте указатель на свою структуру, а затем просто разыщите его, когда вы хотите изменить его часть.
Пример:
struct myStruct {
int a,
b;
};
@interface myClass : NSObject {
myStruct *testStruct;
}
@property myStruct *testStruct;
Затем, чтобы изменить часть myStruct, просто myClassObject.testStruct->a = 55;
Ответ 3
Измените строку синтеза:
@synthesize member = _member;
Затем вы можете назначить значения в одной строке кода:
_member.a = 10;