我定义了一个名为 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];
或者这不起作用?
答案 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值的其他每个类
导入StockHolding #import "StockHolding.h"
创建对象StockHolding *aStockHolding = [[StockHolding alloc] init];
设置值aStockHolding.numberOfShares = 1;
或[aStockHolding setNumberOfShares:1]
通过合成变量,您默认创建了getter和setter方法。
现在,如果要在一个方法调用中设置所有值..
在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
在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
如上所述在其他类中创建对象并调用
StockHolding *aStockHolding = [[StockHolding alloc] init];
[aStockHolding setPurchaseSharePrice:22.3 andCurrentSharePrice:12.22 withTotalNumberOfShares:120]