2010-05-24 59 views
1

我不喜歡在objc中開始編程,我在徘徊如何在現有的objc應用程序中使用python代碼。我發現這個網站和其他一些線程,但他們根本沒有幫助我。我想要做的是採用apple's developer website中的SpotlightAPI,並使用結果用python代碼處理它們。到目前爲止,我已完成以下工作:
1.從蘋果下載SpotlightAPI
2.基於PyObjc的cocoa-python應用程序模板創建一個新項目
3.將SpotlightAPI中的控制器文件添加到PyObjC中
4 。配置綁定的方式與SpotlightAPI中的相同方式
5.執行程序並全部成功工作
6.創建一個從NSObject繼承的新python類文件(稱爲python.py)
7. python文件具有以下代碼:
在現有的應用程序中的python和objc橋樑

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.在或者Controller.h變量聲明添加id *myPython;文件
10.在實施的方法sendit Controller.m或者文件是這樣的:

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

    return [myPython sendit:aString]; 
} 


它編譯和運行成功,但我從初始化函數獲取控制檯消息是:Created PythonClass: (null)以及下一個日誌的字符串返回值爲(null)
任何人都知道我在做什麼錯?

回答

0

在列出的代碼中存在一些可疑的事情。首先,你應該有id myPython而不是id *myPython,因爲id已經是一個指針了。其次,你在NSString類中聲明一個方法,但是在一個子類中實現它。通常,您想要在同一個類的類別實現中實現該方法(本例中爲NSObject)。第三,它有點循環,讓sendit作爲NSObject的一個方法,當它實現時,在myPython上調用sendit,這也是一個NSObject。我很驚訝它編譯並且不會崩潰。嘗試清理這些問題並查看你的位置。希望這可以幫助!