1

私は憤慨してobjcでプログラミングを始めましたが、既存のobjcアプリケーションでpythonコードをどのように使用できるかをさまよっていました。このサイトと他のサイトでいくつかのスレッドを見つけましたが、まったく役に立ちませんでした。私がやりたいことは、Apple の開発者 Web サイトにある SpotlightAPI を取得し、その結果を使用して Python コードで処理することです。
1. Apple から SpotlightAPI をダウンロード2. PyObjc
から cocoa-python アプリケーション テンプレートに基づいて新しいプロジェクトを作成
3. SpotlightAPI から PyObjC にコントローラー ファイルを追加
4. バインディングを構成SpotlightAPI の場合と同じ方法で
5. プログラムを実行すると、すべてが正常に動作します
6. NSObject (python.py と呼ばれる) から継承する新しい python クラス ファイルを作成しました
。 7. python ファイルには次のコードが含まれています。

from Foundation import *
import objc

NSObject = objc.lookUpClass(u"NSObject")
print "PYTHON VERSION BEING USED:"

class Python(NSObject):
    def sendit_(self, something):
        print something
        return "asdf"


8. Controller.m ファイルの先頭に次のコードを挿入しました。

@class Python;

@interface NSObject (MethodsThatReallyDoExist)
-(NSString *) sendit: (id) aString;

@end

@implementation Controller
- (id)init
{
    self = [super init];
    Class pythonClass = NSClassFromString(@"Python");
    myPython = [pythonClass new];
    NSLog(@"Created PythonClass: %@", myPython);
    NSString * oneString = [myPython sendit:@"asdf"];
    NSLog(@"%@", oneString);
    return self;
}


9. id *myPython;Controller.h ファイルの変数宣言に 追加
10. 次のように controller.m ファイルに sendit メソッドを実装:

- (NSString *) sendit:(id) aString
{

    return [myPython sendit:aString];
}


コンパイルして正常に実行されますが、init 関数から得られるコンソール メッセージはCreated PythonClass: (null)次のとおり(null)
です。

4

1 に答える 1

0

あなたがリストしたコードには、いくつかの疑わしいことがあります。まず、id は既にポインターであるため、そうすべきではありid myPythonません。id *myPython次に、NSString カテゴリでメソッドを宣言していますが、サブクラスで実装しています。通常、同じクラス (この場合は NSObject) のカテゴリ実装でメソッドを実装します。3 番目に、sendit を NSObject のメソッドとして持つことは、少し循環的です。これは、実装されると、同じく NSObject である myPython で sendit を呼び出します。コンパイルしてクラッシュしないことに驚いています。これらの問題を解決してみて、どこに到達するかを確認してください。お役に立てれば!

于 2012-03-02T23:18:44.570 に答える