gpt4 book ai didi

python - 如何将 python 可调用作为类型 "block"的参数传递到 objc 方法中

转载 作者:行者123 更新时间:2023-12-01 05:58:26 24 4
gpt4 key购买 nike

我有一个像这样的 objc 方法;

@ implementation of Class1

- (void)execute:(void (^)(Class2* target, NSUInteger idx))block
{
...

}

我想在 python 中使用这个执行方法,我已经构建了一个 python Objective-C 桥数据,它似乎正确生成为:

<class name='Class1'>
<method selector='execute:'>
<arg function_pointer='true' type='@?' index='0'>
<arg type='@'/>
<arg type='I' type64='Q'/>
<retval type='v'/>
</arg>
</method>

但是当我定义这样的函数时:

def myFunc (dev, index):
// do something with dev
print("Hello")

并尝试将其用作 block

class1_obj.execute_(myFunc)

Python 抛出错误:

objc.BadPrototypeError: Objective-C expects 1 arguments, Python argument has 2 arguments for <unbound selector myFunc at 0x105b3a3f0>

我也尝试过使用 lambda 函数,但没有用。

我还尝试创建一个可调用类:

>>> class myCallable(object):
... def __init__(self,name):
... print "Init"
... def __repr__(self):
... return "string init"
... def __call__(self, dev, index):
... # do something with dev
... print("hello")

但是 python 抛出这样的错误:

TypeError: Sorry, cannot create IMP for instances of type myCallable

我想知道我哪里做错了?

最佳答案

感谢乔希的建议。

这个问题终于解决了。看起来系统使用命令行 gen_bridge_metadata 生成的 meta_data 不知何故未正确读取。它生成为:

<method selector='execute:'>
<arg index='0' type='@?' function_pointer='true'>
<arg type='@'/>
<arg type64='Q' type='I'/>
<retval type='v'/>
</arg>
</method>

但是当我将 function_pointer 更改为 block 后,它就可以工作了。我通过阅读 pyobjc block 单元测试得到了这个。

<method selector='execute:'>
<arg index='0' type='@?' block='true'>
<arg type='@'/>
<arg type64='Q' type='I'/>
<retval type='v'/>
</arg>
</method>

但我不确定是什么原因造成的。苹果文档说 if type="@?"并且function_pointer='true',则视为 block 。如果类型=“#?”并且 function_pointer="true"时,它将解释为 function_pointer。但为什么 pyobjc 无法识别这一点?这是 pyobjc 中的错误吗?

关于python - 如何将 python 可调用作为类型 "block"的参数传递到 objc 方法中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11532025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com