Utilice PyObjC.
Se incluye con Leopard & después.
>>> 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>
Incluso funciona con IPython:
In [1]: from Foundation import *
In [2]: a = NSBundle.allFrameworks()
In [3]: ?a
Type: NSCFArray
Base Class: <objective-c class NSCFArray at 0x1002adf40>
`
Para llamar desde Objective-C en Python, la forma más fácil es:
declaran un resumen superclase en Objective-C que contiene la API a la que desea llamar
crean implementaciones de código auxiliar de los métodos en @implementation de la clase
subclase de la clase en Python y proporcionar implementaciones concretas
crean un método de fábrica en la superclase abstracta que crea instancias de las subclases concretas
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"];
No veo cómo funciona esto. Por ejemplo, asumo lo siguiente: (1) pongo el código python en un archivo Concrete.py (2) pongo el código obj-c en Abstract.h/m Dado que, ¿cómo construyes esto exactamente? ¿programa? – Fooberman
Actualización: Hay una aclaración en este ticket: [link] (http://stackoverflow.com/questions/1772491/call-from-objective-c-into-python) – Fooberman
¿Falta un paréntesis de cierre después de "MyConcrete"? –