我正在开发Python / ObjC应用程序,需要从ObjC的Python类中调用一些方法。我已经尝试了几种方法,但都没有成功。
使用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"];
问题内容: 我无法从Objective-C访问Swift Singleton。 swiftSharedInstance无法访问。 问题答案: 现在,我有以下解决方案。也许我忽略了一些使我能够直接访问“ swiftSharedInstance”的东西? 然后在ObjC中,我可以获取sharedInstance类方法(在导入xcode生成的swift标头绑定之后)
问题内容: 我有一个旧的Objective-C项目,我想调用新的Swift函数和对象,我已经创建了文件“ ”和“ ” 对我来说,从Swift调用函数到Objective-C很容易,但是我有一个反向问题。 因此,我创建了一个简单的类“ System.Swift” 现在我尝试按照此处和文件内的文档进行操作 并且已将其导入到Objective-C类中。此时,在我的Objective-C代码的Object
问题内容: 我想使用Cocoa + Objective C创建本机Mac OS X应用程序,但我需要连接到专有数据源,为此,数据源的所有者仅提供Java库。因此,我需要以某种方式将该Java库导入我的项目中,并在其Java类上调用函数(或者在该库周围创建Java包装器,然后从Objective- C调用我的包装器)。 现在,我该怎么做?快速的Google搜索将我引向JNI,但是我没有找到任何好的和
本文向大家介绍Swift调用Objective-C代码,包括了Swift调用Objective-C代码的使用技巧和注意事项,需要的朋友参考一下 最近iOS开发之新编程语言Swift在iOS开发圈内反响比较大,国内外都有很多教程或小示例。 虽然Swift这门语言仍然在不断的进化之中,而且变动还是比较大,苹果公司也不承诺目前所写代码会在将来兼容,但仍挡不住iOS开发者的热情。 为什么要使用Swift调
本文向大家介绍Objective-C语言调用方式,包括了Objective-C语言调用方式的使用技巧和注意事项,需要的朋友参考一下 示例 调用实例方法: 在当前实例上调用实例方法: 调用一个带有参数的方法: 调用类方法:
问题内容: 构建与C或C ++库的Python绑定的最快方法是什么? (如果这很重要,我正在使用Windows。) 问题答案: Boost Python库是用于连接Python和C 的框架。它使您可以快速而无缝地将C 类的函数和对象暴露给Python,反之亦然,而无需使用特殊工具-仅使用C 编译器即可。它被设计为以非介入方式包装C 接口,因此您不必为了包装而完全更改C ++代码,从而使Boost.