在Objective-C中,我似乎无法制作指向属性的指针。例如:
我创建了一个名为Car的类,它是SKSpriteNode的SubClass。
SKSpriteNode的一个属性是它的位置(CGPoint)。
现在我的Car类,我想创建4个名为wheelPosition1,wheelPosition2,wheelPosition3,wheelPosition4的新属性(所有这些都是CGPoints)
每个wheelPosition属性都与Car的位置属性相关(因为汽车的位置属性代表中心,而车轮在4个方向上分出1,1),如下所示:
我希望每当检索或设置它们的值时,wheelPosition属性都指向汽车的position属性的地址......
Xcode不允许我这样做,因为.position属性是"临时" - 所以我不能做这样的事情:
CGPoint * x = &sprite.position;
在这个例子中,明显的解决方案只是创建一个新的轮胎类并创建一个带有4个轮胎的节点树......但这只是一个例子来说明我的问题。这只是我在编程时发现的一般问题 - 我无法将变量指向另一个Object的属性。
现在我不得不在课堂上改变我的二传手法来解决这个问题,这意味着如果我想把汽车的中心移到其他地方,那就更难了......
但是还有另一种方法可以让我指出这个类的属性吗?
根据以下评论的要求,这里是代码:
@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
以下是如何应用代码的示例:
@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
在任何一种情况下,当另一个属性发生时,属性不会改变。
答案 0 :(得分:0)
你的做法是错误的。你不需要指针。只需使用self.position
从(中心)位置计算车轮位置。你需要间接指针,如果应该使用的属性可以改变(不是它的值,而是属性本身),i。即从position
到anotherPosition
。
但是,您不将地址运算符应用于属性的ivar,而是应用于getter -position
的返回值。返回值是临时的。如果您想要指向ivar本身的指针,请使用&_position
。
但正如我所说:不要这样做。