Я снова начал программировать в objc, и я блуждал, как я могу использовать код python в существующем приложении objc. Я нашел некоторые темы на этом сайте и некоторые другие, но они не помогли мне вообще. Я хочу сделать SpotlightAPI, найденный в веб-сайте разработчика Apple, и использовать результаты для обработки их с помощью кода python. До сих пор я делал следующее:
1. Скачал SpotlightAPI из apple
2. создал новый проект на основе шаблона приложения cocoa -python от PyObjc
3. добавили файлы контроллера из SpotlightAPI в PyObjC
4. Настроил привязки так же, как в SpotlightAPI
5. Выполняется программа и все работает успешно
6. создал новый файл класса 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. добавлен id *myPython;
в объявления переменных в файле Controller.h
10. реализовал метод sendit в файле controller.m следующим образом:
- (NSString *) sendit:(id) aString
{
return [myPython sendit:aString];
}
он компилируется и запускается успешно, но консольное сообщение, которое я получаю от функции init: Created PythonClass: (null)
, а также строка возвращает следующий журнал (null)
кто знает, что я делаю неправильно?
В коде, который вы указали, есть несколько сомнительных вещей. Во-первых, вы должны иметь id myPython
not id *myPython
, поскольку id уже является указателем. Во-вторых, вы объявляете метод в категории NSString, но реализуете его в подклассе. Как правило, вы хотите реализовать метод в реализации категории в том же классе (NSObject в этом случае). В-третьих, все его бит-циркуляр имеет sendit как метод в NSObject, который при реализации вызывает sendit на myPython, который также является NSObject. Я удивлен, что он компилируется и не разбивается. Попытайтесь очистить эти проблемы и посмотреть, где вы находитесь. Надеюсь, это поможет!