Verwenden Sie PyObjC.
Es ist im Lieferumfang von Leopard & später enthalten.
>>> from Foundation import *
>>> a = NSArray.arrayWithObjects_("a", "b", "c", None)
>>> a
(
a,
b,
c
)
>>> a[1]
'b'
>>> a.objectAtIndex_(1)
'b'
>>> type(a)
<objective-c class NSCFArray at 0x7fff708bc178>
Es funktioniert sogar mit ipython:
In [1]: from Foundation import *
In [2]: a = NSBundle.allFrameworks()
In [3]: ?a
Type: NSCFArray
Base Class: <objective-c class NSCFArray at 0x1002adf40>
`
zu nennen, von Objective-C in Python, der einfachste Weg ist:
eine abstrakte erklären Superklasse in Objective-C, die die API enthält, die Sie aufrufen möchten
erstellen Stub-Implementierungen der Methoden in der @implementation Klasse
Unterklasse der Klasse in Python und bieten eine Factory-Methode auf der abstrakten Super konkrete Implementierungen
erstellen, die Instanzen konkrete Unterklasse
schafft
Ie
@interface Abstract : NSObject
- (unsigned int) foo: (NSString *) aBar;
+ newConcrete;
@end
@implementation Abstract
- (unsigned int) foo: (NSString *) aBar { return 42; }
+ newConcrete { return [[NSClassFromString(@"MyConcrete") new] autorelease]; }
@end
.....
class Concrete(Abstract):
def foo_(self, s): return s.length()
.....
x = [Abstract newFoo];
[x foo: @"bar"];
Ich sehe nicht, wie das funktioniert. Zum Beispiel nehme ich folgendes an: (1) setze den Python-Code in eine Datei Concrete.py (2) setze den obj-c-Code in Abstract.h/m Gegeben, wie genau erstellst du das Programm? – Fooberman
Update: Es gibt eine Erklärung zu diesem Ticket: [link] (http://stackoverflow.com/questions/1772491/call-from-objective-c-into-python) – Fooberman
Fehlt dies eine schließende Klammer nach "MyConcrete"? –