属性和指针

时间:2015-06-09 19:25:35

标签: objective-c pointers properties

在Objective-C中,我似乎无法制作指向属性的指针。例如:

我创建了一个名为Car的类,它是SKSpriteNode的SubClass。

SKSpriteNode的一个属性是它的位置(CGPoint)。

现在我的Car类,我想创建4个名为wheelPosition1,wheelPosition2,wheelPosition3,wheelPosition4的新属性(所有这些都是CGPoints)

每个wheelPosition属性都与Car的位置属性相关(因为汽车的位置属性代表中心,而车轮在4个方向上分出1,1),如下所示:

enter image description here

我希望每当检索或设置它们的值时,wheelPosition属性都指向汽车的position属性的地址......

Xcode不允许我这样做,因为.position属性是"临时" - 所以我不能做这样的事情:

CGPoint * x = &sprite.position; 

在这个例子中,明显的解决方案只是创建一个新的轮胎类并创建一个带有4个轮胎的节点树......但这只是一个例子来说明我的问题。这只是我在编程时发现的一般问题 - 我无法将变量指向另一个Object的属性。

现在我不得不在课堂上改变我的二传手法来解决这个问题,这意味着如果我想把汽车的中心移到其他地方,那就更难了......

enter image description here

但是还有另一种方法可以让我指出这个类的属性吗?

根据以下评论的要求,这里是代码:

@interface SomeClass : SKSpriteNode

@property CGPoint newNameForPositionProperty;

-(void) newPositionToPosition

@end



@implementation SomeClass

@synthesize newNameForPositionProperty;

-(void) newPositionToPosition {

    newNameForPositionProperty = self.position;

}
@end



@implementation GameScene

-(void)didMoveToView:(SKView *)view {


    SomeClass *newObject = [[SomeClass alloc] init];

    newObject.position = CGPointMake(100, 100 * sqrt(3.0));
    [newObject newPositionToPosition];

    NSLog(@"Original Position Property: (%f, %f)", newObject.position.x, newObject.position.y);
    NSLog(@"New Position Property: (%f, %f)", newObject.newNameForPositionProperty.x, newObject.newNameForPositionProperty.y);

    //Change Position
    NSLog(@" ");
    //

    newObject.position = CGPointMake(100, 100);

    NSLog(@"Original Position Property: (%f, %f)", newObject.position.x, newObject.position.y);
    NSLog(@"New Position Property: (%f, %f)", newObject.newNameForPositionProperty.x, newObject.newNameForPositionProperty.y);
}

@end

enter image description here

以下是如何应用代码的示例:

@interface SomeClass : SKSpriteNode

@property double modulus, argument;

-(void) positionToModulusArgument;

@end



@implementation SomeClass

@synthesize modulus, argument;

-(void) positionToModulusArgument {

    modulus = sqrt(pow(self.position.x, 2) + pow(self.position.y, 2));

    //Realistically I would split the argument into 4 cases to represent the 4 quadrants, but as this is only an example, I will assume that the position is only in the top right quadrant.
    argument = atan(self.position.y / self.position.x);
}

@end



@implementation GameScene

-(void)didMoveToView:(SKView *)view {


    SomeClass *newObject = [[SomeClass alloc] init];

    newObject.position = CGPointMake(100, 100 * sqrt(3.0));
    [newObject positionToModulusArgument];

    NSLog(@"Cartesian Form: (%f, %f)", newObject.position.x, newObject.position.y);
    NSLog(@"Polar Form: (%f, %f)",newObject.modulus, newObject.argument);

    //Change Position
    NSLog(@" ");
    //

    newObject.position = CGPointMake(100, 100);

    NSLog(@"Cartesian Form: (%f, %f)", newObject.position.x, newObject.position.y);
    NSLog(@"Polar Form: (%f, %f)",newObject.modulus, newObject.argument);
}

@end

enter image description here

在任何一种情况下,当另一个属性发生时,属性不会改变。

1 个答案:

答案 0 :(得分:0)

你的做法是错误的。你不需要指针。只需使用self.position从(中心)位置计算车轮位置。你需要间接指针,如果应该使用的属性可以改变(不是它的值,而是属性本身),i。即从positionanotherPosition

但是,您不将地址运算符应用于属性的ivar,而是应用于getter -position的返回值。返回值是临时的。如果您想要指向ivar本身的指针,请使用&_position

但正如我所说:不要这样做。