1

我已经定义了一个名为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];

或者这行不通?

4

3 回答 3

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];

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


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

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

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

@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];

请注意,为此,您不必这些变量声明或实现 setter 和 getter。换句话说,您可以安全地删除它:

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

因为如果您使用@propertys,编译器会自动为您添加它。

阅读此问题及其答案,了解有关实例变量和@property.

于 2013-07-17T10:58:44.523 回答
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. 进口控股#import "StockHolding.h"

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

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

通过综合变量,您默认创建了 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]
    
于 2013-07-17T11:04:46.273 回答
0

您可以像这样只创建一条消息,而不是创建三个不同的消息 -

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

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

- (NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)date
于 2013-07-17T10:46:51.980 回答