2010-03-11 74 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;