将多个变量分配给类实例

时间:2013-07-17 10:43:41

标签: objective-c variables

我定义了一个名为 StockHolding 的新类,它具有 NSObject 类的所有方法和实例变量。并添加了3个实例变量:

@interface StockHolding : NSObject
{
    float purchaseSharePrice;
    float currentSharePrice;
    int numberOfShares;
}

另外,我添加了实例方法

- (void)setPurchaseSharePrice:(float)p;
- (void)setCurrentSharePrice:(float)c;
- (void)setNumberOfShares:(int)n;

main.m 文件中,我创建了一个类

的实例
StockHolding *stock = [[StockHolding alloc] init];

并希望使用变量创建和对象

StockHolding *a = [stock setPurchaseSharePrice:2.30 setCurrentSharePrice:4.50 setNumberOfShares:40];

但收到错误

  

'StockHolding'没有可见的@interface声明选择器'setPurchaseSharePrice:setCurrentSharePrice:setNumberOfShares:'

我做错了什么?或者它只是没有正确使用继承的实例。

我看到了例子:

NSCalendar *cal = [NSCalendar currentCalendar];
NSUInteger day = [cal ordinalityOfUnit:NSDayCalendarUnit
                                inUnit:NSMonthCalendarUnit
                               forDate:now];

或者这不起作用?

3 个答案:

答案 0 :(得分:1)

你不能只在一组括号中连接多个方法调用。如果您想初始化(创建一个新的实例)StockHolding对象,您需要声明一个这样的方法:

- (void)initWithPurchaseSharePrice:(float)p currentSharePrice:(float)c numberOfShares:(int)n;

与此类似地实施它:

- (void)initWithPurchaseSharePrice:(float)p currentSharePrice:(float)c numberOfShares:(int)n {
    self = [super init];
    if (self) {
        purchaseSharePrice = p;
        currentSharePrice = c;
        numberOfShares = n;
    }
    return self;
}

这称为初始化方法。它创建了一个类的新实例并返回它。

然后,您可以像这样使用它:

StockHolding *a = [[StockHolding alloc] initWithPurchaseSharePrice:2.30 currentSharePrice:4.50 numberOfShares:40];

请注意,实际的方法名称等可以是任意的,不必以任何方式与实例变量的名称相关联(除非您覆盖@property的getter和setter,但那是另一个故事),因为你仍然必须自己实施这个方法,你可以在那里做任何你想做的事。


如果您已经创建了这样的实例:

StockHolding *stock = [[StockHolding alloc] init];

并且想要设置变量的值,您应该使用@property而不是实例变量:

@interface StockHolding : NSObject

@property float purchaseSharePrice;
@property float currentSharePrice;
@property int numberOfShares;

@end

之后,你可以像这样直接设置它们:

StockHolding *stock = [[StockHolding alloc] init];
stock.purchaseSharePrice = whatever;

[stock setPurchaseSharePrice:2.30];
[stock setCurrentSharePrice:4.50];

请注意,要使其正常工作, 换句话说,您可以安全地删除它:

- (void)setPurchaseSharePrice:(float)p;
- (void)setCurrentSharePrice:(float)c;
- (void)setNumberOfShares:(int)n;

因为如果您使用@property s。

,编译器会自动为您添加它

阅读this question及其答案,了解有关实例变量与@property之间差异的更多信息。

答案 1 :(得分:0)

除了创建三个不同的消息,您只能创建一个这样的消息 -

- (void)setPurchaseSharePrice:(float)p setCurrentSharePrice:(float)c setNumberOfShares:(int)n;

然后你可以轻松地调用它。您在此处显示的NSCalendar示例与单个消息相同 -

- (NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date

答案 2 :(得分:0)

在StockHolding.h

@interface StockHolding : NSObject

@property (nonatomic, assign) float purchaseSharePrice;
@property (nonatomic, assign) float currentSharePrice;
@property (nonatomic, assign) int numberOfShares;

@end

在StockHolding.m

#import "StockHolding.h"

@implementation StockHolding ()

@synthesize purchaseSharePrice;
@synthesize currentSharePrice;
@synthesize numberOfShares;

@end

现在,您想要设置StockHolding值的其他每个类

  1. 导入StockHolding #import "StockHolding.h"

  2. 创建对象StockHolding *aStockHolding = [[StockHolding alloc] init];

  3. 设置值aStockHolding.numberOfShares = 1;[aStockHolding setNumberOfShares:1]

  4. 通过合成变量,您默认创建了getter和setter方法。


    现在,如果要在一个方法调用中设置所有值..

    1. 在StockHolding.h中声明一个方法

      @interface StockHolding : NSObject
      
      @property (nonatomic, assign) float purchaseSharePrice;
      @property (nonatomic, assign) float currentSharePrice;
      @property (nonatomic, assign) int numberOfShares;
      
      - (void)setPurchaseSharePrice:(float)iPurchase andCurrentSharePrice:(float)iCurrent withTotalNumberOfShares:(int)iTotal;
      
      @end
      
    2. 在StockHolding.m中定义方法

      @implementation StockHolding ()
      
      @synthesize purchaseSharePrice;
      @synthesize currentSharePrice;
      @synthesize numberOfShares;
      
      - (void)setPurchaseSharePrice:(float)iPurchase andCurrentSharePrice:(float)iCurrent withTotalNumberOfShares:(int)iTotal {
        self.purchaseSharePrice = iPurchase;
        self.currentSharePrice = iCurrent;
        self.numberOfShares = iTotal;
      }
      @end
      
    3. 如上所述在其他类中创建对象并调用

      StockHolding *aStockHolding = [[StockHolding alloc] init];
      [aStockHolding setPurchaseSharePrice:22.3 andCurrentSharePrice:12.22 withTotalNumberOfShares:120]