Проксирование класса Python в Objective-C

1

Я пытаюсь проксировать существующий класс Python для Objective-C. Я начал с простой выборки класса Python:

Test.py


class Test:
    def __init__(self):
        self.text = ""

    def addText(self, _text):
        self.text = self.text + _text

    def addSomeText(self):
        self.addText("SomeText")

Затем я написал для него класс Objective-C.

ITest.h


#import <Cocoa/Cocoa.h>


@interface ITest : NSObject

- (void) addText: (NSString *)text;
- (void) addSomeText;

+ newTest;

@property (nonatomic, assign, getter = _text) NSString *text;

@end

ITest.m


#import "ITest.h"

#define ABSTRACT { return nil; }
#define ABSTRACT_VOID { }


@implementation ITest
@dynamic text;

- (void) addText: (NSString *)text ABSTRACT_VOID;
- (void) addSomeText ABSTRACT_VOID;

+ newTest {
    return [[NSClassFromString(@"TestProxy") new] autorelease];
}

@end

Мой класс прокси (следующий за некоторыми статьями о PyObjC I, подклассифицирующий класс Objective-C и подклассификацию исходного класса для доступа к его переменным экземпляра):

TestProxy.py


import Foundation
import objc

from Test import Test

ITest = objc.lookUpClass("ITest")

class TestProxy (ITest, Test):
    # getters/setters
    def setText_(self, _text):
        self.text = _text

    def _text(self):
        return self.text

    # methods
    def addText_(self, text):
        Test.addText(self, text)

    def addSomeText(self):
        Test.addSomeText(self)

Теперь, если я это сделаю

ITest *test = [ITest newTest];

Я всегда получаю nil без предупреждений или ошибок в консоли отладки.

Если я удалю все импорт и ссылки на исходный класс Test, я получу рабочий объект. Я заметил, что nil будет возвращен точно, как только я добавлю from Test import Test.

Я думаю, что это происходит потому, что PyObjC пытается скрыть Test класс и терпит неудачу, потому что его методы не соответствуют правилам именования мостов.

Есть ли способ сказать PyObjC не делать этого? Или, может быть, все, что я сделал, неправильно, и есть лучший способ перевести существующие вещи Python в Objective-C?

  • 0
    Вы делаете несколько странных вещей, которые, как я ожидаю, позже вызовут проблемы, но что касается создания экземпляра ITest , ваш код успешно выполняется для меня. Я предполагаю, что вы проверяете значение сразу после ITest *test = [ITest newTest]; ? Т.е. NSLog(@"%@", test); - это печатает <TestProxy: 0x4290ca0> когда я делаю это на следующей строке.
  • 0
    @josh-caswell josh-caswell Ну, я довольно новичок в PyObjC, и это не очень хорошо задокументировано. Как вы включаете Python? Я создал целевой объект со всеми файлами, упомянутыми выше, который зависит от Python.framework, и добавил файл .m с функцией TestProxy_Init - ... skip PYTHONPATH stuff ... Py_Initialize (); PyImport_ImportModule ( "TestProxy") ;. В моем основном приложении я вызываю TestProxy_Init и создаю ITest.
Показать ещё 3 комментария
Теги:
pyobjc

1 ответ

0
Лучший ответ

Я просто хочу убедиться, что вы написали метод newText без типа преднамеренно. Цели-c-методы скорее всего имеют тип возвращаемого значения, и если вы не хотите, чтобы какой-то конкретный тип возвращался, используйте ключевое слово "id".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню