Вызов Python от Objective C

Сделайте

from time import time

t = time()
  • t - пускают в ход число, хорошее для измерения временного интервала.

существует некоторое различие для Unix и платформ Windows.

7
задан Jonathan Leffler 20 August 2009 в 20:05
поделиться

1 ответ

Используйте PyObjC.

Он включен в Leopard и более поздние версии.

>>> 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>

Он работает даже с iPython:

In [1]: from Foundation import *

In [2]: a = NSBundle.allFrameworks()

In [3]: ?a
Type:       NSCFArray
Base Class: <objective-c class NSCFArray at 0x1002adf40>

`

Для вызова из Objective-C в Python необходимо Самый простой способ:

  • объявить абстрактный суперкласс в Objective-C, который содержит API, который вы хотите вызвать

  • создать заглушку реализации методов в @implementation

  • класса, подкласс класса в Python и предоставить конкретные реализации

  • создать фабричный метод в абстрактном суперклассе, который создает конкретные экземпляры подкласса

Т.е.

@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"];
16
ответ дан 6 December 2019 в 12:53
поделиться