我心不在焉地开始用objc编程,我在闲逛如何在现有的objc应用程序中使用python代码。我在这个网站和其他一些网站上找到了一些帖子,但他们根本没有帮助我。我想做的是采用apple's developer website中找到的SpotlightAPI并使用结果用python代码处理它们。到目前为止,我已经完成了以下工作:1。从苹果2下载了SpotlightAPI。基于PyObjc
3的cocoa-python应用程序模板创建了一个新项目。将SpotlightAPI中的控制器文件添加到PyObjC
4中。配置绑定的方式与SpotlightAPI中的绑定方式相同。执行该程序并成功完成所有工作。创建了一个新的python类文件,它继承自NSObject(称为python.py)
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.在Controller.h文件的变量声明中添加id *myPython;
10.在controller.m文件中实现了sendit方法,如下所示:
- (NSString *) sendit:(id) aString
{
return [myPython sendit:aString];
}
它编译并成功运行,但我从init函数得到的控制台消息是:Created PythonClass: (null)
并且下一个日志的字符串返回是(null)
谁知道我做错了什么?
答案 0 :(得分:0)
您列出的代码中有一些可疑的内容。首先,您应该id myPython
而不是id *myPython
,因为ID已经是指针。其次,您在NSString类别上声明了一个方法,但是在子类中实现它。通常,您希望在同一个类的类别实现中实现该方法(在本例中为NSObject)。第三,将它作为一个方法在NSObject上有点循环,当它实现时调用myPython上的sendit,它也是一个NSObject。我很惊讶它编译并且不会崩溃。尝试清理这些问题,看看你得到了什么。希望这有帮助!