Я пытаюсь проксировать существующий класс 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?
Я просто хочу убедиться, что вы написали метод newText без типа преднамеренно. Цели-c-методы скорее всего имеют тип возвращаемого значения, и если вы не хотите, чтобы какой-то конкретный тип возвращался, используйте ключевое слово "id".
ITest
, ваш код успешно выполняется для меня. Я предполагаю, что вы проверяете значение сразу послеITest *test = [ITest newTest];
? Т.е.NSLog(@"%@", test);
- это печатает<TestProxy: 0x4290ca0>
когда я делаю это на следующей строке.