5

PyObjC を介して iPhone の加速度計にアクセスしたいと考えています。ここに私のコードがあります:

@objc.signature("v@:@@")
def accelerometer_didAccelerate_(self, accelerometer, acceleration):
    msgBox = UIAlertView.alloc().initWithTitle_message_delegate_cancelButtonTitle_otherButtonTitles_("Acceleration", str(acceleration.x), self, "OK", None)
    msgBox.show()
    msgBox.release()

@objc.signature("v@:@")
def applicationDidFinishLaunching_(self, unused):
    self.accelerometer = UIAccelerometer.sharedAccelerometer()
    self.accelerometer.setUpdateInterval_(1)
    self.accelerometer.setDelegate_(self)
    #...

問題は str(accellation.x) が返すこと"<native-selector x of <UIAcceleration: 0x.....>>"です。私に何ができる?

4

1 に答える 1

8

の値は Objective-C でプロパティとして定義されており、Pythonでアクセスすると、期待どおりの「x」という名前の属性 (ivar) ではなく、「x」という名前のUIAccelerationメソッドが得られます。あなたは言う必要があります:xacceleration.x

acceleration._.x

これは、PyObjC の「魔法の」アクセサー メカニズムを使用して、必要な属性を取得します。

この理由:

Python のクラスの名前空間のしくみでは、メソッドと属性を同じ名前にすることはできません。これは、getter メソッドがアクセスする属性と同じ名前を持つことが多い Objective-C とは対照的です。

この違いにより、Objective-C 2.0 のプロパティ機能で少し混乱が生じる可能性があります。特に、2 つの言語間で構文が同じに見えるためです。Objective-C では、次のように記述します。

NSLog(@"foo's bar: %f", foo.bar);
foo.bar = 10.0;

適切なセッターまたはゲッター メソッド (-barおよび-setBar:) を自動的に使用します。PyObjC は、Python のクラス名前空間規則のために、Objective-C コードが行うことを正確に行うことができず、name で表すもの (メソッドまたは属性) を 1 つだけ選択する必要がありますfoo.bar。それが選択するのは方法です。

于 2011-03-11T10:37:45.763 に答える