2010-03-11 85 views
10

我想更改变量值,它是另一个类的结构的成员。 但价值没有得到改变。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 

我试过了下面的链接。

Structure as a class member in Objective C

问候, Dhana。

回答

22

要对“成员”实例变量进行更改,您需要对其进行全面设置。你应该这样做:

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'结构的副本。然后立即修改该副本,并在该方法结束时丢弃副本。

+0

哦,'t.member.a'对于'member.a'的值来说就好了。这与'[t member] .a'完全相同。 – 2010-03-11 20:07:20

+0

是啊,它工作正常.. 我试图做的一切在一个步骤.. – Dhanaraj 2010-03-12 04:18:07

+1

你知道什么是声音,殿下?这些都是尖锐的C#开发人员。如果你不相信我,就等着。当他们即将在Objective-C中使用点符号时,它们会变得越来越响亮! http://www.youtube.com/watch?v=Tfo3nEZHNLk – Steve 2011-10-31 00:13:10

4

改为建立一个指向你的结构体的指针,然后当你想改变它的一部分时,只需解引用它。

例子:

struct myStruct { 
    int a, 
     b; 
}; 

@interface myClass : NSObject { 
myStruct *testStruct; 
} 

@property myStruct *testStruct; 

然后改变MYSTRUCT的一部分,只是做myClassObject.testStruct->a = 55;

1

更改合成线:

@synthesize member = _member;

然后你可以在一行赋值代码:

_member.a = 10;