1

私の理解では、自己は現在のクラスを指し、自己の後にドットを使用すると、そのプロパティの1つを使用することになります。ここのコードにはself.popOperand、popOpernad がプロパティでないかどうかわからないという用途があります。私が理解していないもう1つのことは、なぜ [self pushOperand:result];機能し、[self.pushOperand:result];機能しないのかということです。

#import "Calcbrain.h"
@interface Calcbrain()

@property (nonatomic,strong) NSMutableArray *operandStack;


@end


@implementation Calcbrain
@synthesize operandStack  = _operandStack;

-(NSMutableArray *) operandStack
{
    if(_operandStack == nil) _operandStack = [[NSMutableArray alloc]init];
    return _operandStack;
}
-(double)popOperand
{
    NSNumber *objectNum = [self.operandStack lastObject];
    if (objectNum)[self.operandStack removeLastObject];
    return [objectNum doubleValue];

}
/*-(void) setOperandStack:(NSMutableArray *)operandStack
{
    _operandStack = operandStack;
}*/

-(void)pushOperand:(double)opernand
{
    [self.operandStack addObject:[NSNumber numberWithDouble:opernand]];

}
-(double)performOperation:(NSString *)operation
{
    double result=0;

    if([operation isEqualToString:@"+"])
    {
        result = self.popOperand + self.popOperand;
    }
    else if ([@"*" isEqualToString:operation])
    {
        result = self.popOperand * self.popOperand;
    }
    [self pushOperand:result];

    return result;
}


@end
4

3 に答える 3

3

この.表記は主にプロパティに使用されますが、値を返すパラメーターのないメソッドにも使用できます。なんで?プロパティの合成されたゲッターは同じ形式であるためです。

-(double)calcValue {
    ....
    return value;
}

プロパティ宣言と同等です:

@property (nonatomic, readonly) double calcValue;

プロパティの宣言がない場合でも、.表記法が使用できないわけではありません。コンパイラは、構文糖の形式と.同様に、コンパイル時に表記法をメソッド呼び出しに効果的に変更します。そのとおり:.

self.popOperand
// Translates to
[self popOperand];

これはパート 2 につながりますが、なぜうまくいか[self.pushOperand:result];ないのでしょうか? その理由は.、パラメータの直接の受け渡しをサポートしていないためです。

パラメーターをプロパティに割り当てる/プッシュする唯一の方法は を使用することですが、これは機能しません。表記の割り当てがマップされる対応するself.pushOperand = resultがないためです。- (void)setPushOperand:(double)pushOperand;.

[self pushOperand:result];と呼ばれる特定のメソッドを明示的に呼び出しているため、機能しますpushOperand:

全体として、.プロパティの表記のみを保持し、「プロパティ」として設計されていないメソッドを使用している場合は、明示してください。

Update: selfは予約済みのキーワードで、その時点で作業しているインスタンスへのポインターを表します。

たとえば、Calcbrain BrainViewController など、Calcbrain の外側に2 つのインスタンスを作成できます。

Calcbrain* instance1;
Calcbrain* instance2;

ここで、メソッドが宣言されているので、例としてCalcbrain使用してみましょう。-(double)performOperation:(NSString *)operationこれを BrainViewController から呼び出したい場合は、次のようにします。

[instance1 performOperation:@"+"];
[instance2 performOperation:@"+"];

別のクラスの一部であるメソッドを呼び出しているため、それを参照するために作成した正しいインスタンス (つまりinstance1instance2) を決定する必要があります。しかし、それをクラス自体から呼び出して、それが正しいインスタンスに適用されるようにするにはどうすればよいでしょうか? 私が作成したインスタンスは、私が作成した他のインスタンスを認識していません。を使用しselfます。selfメソッド内で自分自身を参照できます。そのため、自分自身の中に入れたい場合はperformOperationCalcbrainself を使用する必要があります。

[self performOperation:@"+"];
于 2012-11-01T12:29:55.273 に答える
2

「ドット」は単なる構文糖衣であり、宣言されたプロパティがなくても使用できます。表現

a.someProperty

と同等です

[a someProperty]

と式

a.someProperty = c

と同等です

[a setSomeProperty:c]

したがって、self.popOperandは とまったく同じ[self popOperand]です。また、 のようなばかげた場合に「ドット」を使用することもできます[NSMutableArray alloc].init


非プロパティに「ドット」構文を使用することは強くお勧めしません。私がこのコードのメンテナーだったら、混乱を避けるためにすべてself.popOperand元に戻します。[self popOperand]

(ところで、どちら側が+最初に評価されるかは定義されていません。より良い変更

result = [self popOperand] + [self popOperand]

double operand1 = [self popOperand]
double operand2 = [self popOperand]
result = operand1 + operand2;

-これは、とを定義するときに問題になります/。)

于 2012-11-01T12:28:46.617 に答える
0

ドットは、クラスのプロパティにアクセスするために使用されます。ドットなしでプロパティとメソッドにアクセスすることもできます。

[classInstance someMethodOrProperty];

このコード:[classInstance someProperty];このコードと等しいclassInstance.someProperty;ドットのようなプロパティでメソッドを呼び出すことはできません。

于 2012-11-01T12:30:48.303 に答える