2011-11-30 69 views
1

我正在尝试访问目标C类中的结构。但我是 不成功。任何人都可以解释这个类是如何调整 使其编译和访问成员变量?如何在objectiveC类中使用struct和union?

#import <Foundation/Foundation.h> 

enum ACCOUNT_TYPE {  
     SAVINGS, 
     LOAN, 
     FIXED_DEPOSIT 
}; 

struct SavingsData { 
     NSMutableString* accountName; 
     NSMutableString* accountType; 
     NSMutableString* balance; 
     NSMutableString* currency; 
}; 

struct LoanData { 
     NSMutableString* accountName; 
     NSMutableString* balance; 
}; 

struct FixedDepositData { 
     NSMutableString* accountName; 
     NSMutableString* depositAmount; 
     NSMutableString* roi; 
}; 

union AccountData { 
     struct SavingsData *savingsData; 
     struct LoanData *loanData; 
     struct FixedDepositData *fixedDepositData; 
}; 

@interface Account : NSObject { 
     NSMutableString* accountId; 
     enum ACCOUNT_TYPE type; 
     union AccountData *accountData; 
} 

@property (nonatomic, assign) NSMutableString* accountId; 
@property (nonatomic, assign) enum ACCOUNT_TYPE type; 
@property (nonatomic, assign) union AccountData *accountData; 

回答

1

你应该有它的静态

@interface Account : NSObject { 
     union AccountData accountData; 
} 

@property (nonatomic, assign) union AccountData accountData; 

否则,你将需要在初始化动态创建(或设置为NULL)。你也需要确保你的结构中的所有这些NSMutableString指针都被正确初始化,否则为零。此外,您应该小心内存管理,因为在传递字符串时不会保留字符串(您可以重写setter/getter以使结构保留/相应地释放NSMutableString)。

+0

我试图使用(。)运算符访问变量。我想我必须使用accountData-> savingsData-> accountName。编译。尚未在运行时尝试...即将开始。感谢您的反馈如此之快。它有助于。 – Satish

2

尝试以下(展示一个作为一个例子,但适用于所有的),使用的typedef和移动的名义申报外....

typedef enum {  
     SAVINGS, 
     LOAN, 
     FIXED_DEPOSIT 
} ACCOUNT_TYPE; 

的使用...

ACCOUNT_TYPE type; 
AccountData accountData; 
1

我会建议使用typedef关键字:

typedef NS_ENUM(NSUInteger, ACCOUNT_TYPE) { 
    SAVINGS = 0, 
    LOAN, 
    FIXED_DEPOSIT 
}; 

typedef struct _SavingsData { 
     NSMutableString* accountName; 
     NSMutableString* accountType; 
     NSMutableString* balance; 
     NSMutableString* currency; 
} SavingsData; 

@interface Account : NSObject 

@property (nonatomic, strong) NSMutableString* accountId; 
@property (nonatomic, assign) ACCOUNT_TYPE type; 
@property (nonatomic, assign) SavingsData savingData; 

@end 

现在你可以使用这个类为:

Account *acc = [Account new]; 
acc.type = SAVINGS; 
SavingsData savData = {..., ...}; 
acc.savingsData = savData; 
1

我建议像子类:

@interface Account : NSObject { 
    NSMutableString *accountId; 
    NSMutableString *accountName; 
} 
@end 

@interface SavingsAccount : Account { 
    NSMutableString *accountType; 
    NSMutableString *balance; 
    NSMutableString *currency; 
} 
@end 

@interface LoanAccount : Account { 
    NSMutableString *balance; 
} 
@end 

@interface FixedDepositAccount : Account { 
    NSMutableString *depositAmount; 
    NSMutableString *roi; 
} 
@end 

属性被剪断,并且帐户名被移到基类账户,因为它在所有3子很普遍。

+0

看起来不错的设计。感谢您的建议。 – Satish