Pro-Python类到Objective-C

时间:2011-06-26 13:33:19

标签: python objective-c pyobjc

我尝试将现有的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?

1 个答案:

答案 0 :(得分:0)

我只是想确保你有意识地写了没有返回类型的newText方法。 objective-c方法最有可能返回类型,如果您不希望返回特定类型,请使用关键字“id”。