我尝试将现有的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的一些文章我将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 :(得分:0)
我只是想确保你有意识地写了没有返回类型的newText方法。 objective-c方法最有可能返回类型,如果您不希望返回特定类型,请使用关键字“id”。