Sử dụng PyObjC.
Nó được bao gồm với Leopard & sau đó.
>>> 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>
Nó thậm chí làm việc với ipython:
In [1]: from Foundation import *
In [2]: a = NSBundle.allFrameworks()
In [3]: ?a
Type: NSCFArray
Base Class: <objective-c class NSCFArray at 0x1002adf40>
'
Để gọi từ Objective-C vào Python, cách dễ nhất là:
tuyên bố một bản tóm tắt siêu lớp trong Mục tiêu-C chứa API bạn muốn gọi
tạo triển khai còn sơ khai của phương pháp trong @implementation của lớp
lớp lớp bằng Python và cung cấp triển khai cụ thể
tạo ra một phương pháp nhà máy trên lớp cha trừu tượng tạo ra trường hợp lớp bê tông
Tức là
@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"];
Tôi không thấy cách hoạt động của tính năng này. Ví dụ, tôi giả định như sau: (1) đặt mã python trong một tệp Concrete.py (2) đặt mã obj-c trong Abstract.h/m Cho rằng, làm thế nào chính xác bạn xây dựng này chương trình? – Fooberman
Cập nhật: Có làm rõ trên vé này: [link] (http://stackoverflow.com/questions/1772491/call-from-objective-c-into-python) – Fooberman
Điều này có thiếu dấu đóng ngoặc sau "MyConcrete" không? –