带范围的pyobjc索引访问器方法

2024-04-26 09:25:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在Python中为我的模型类实现一个索引访问器方法,如the KVC guide。我想使用可选的ranged方法,一次加载多个对象以提高性能。该方法接受一个指向C数组缓冲区的指针,我的方法需要将对象复制到该缓冲区中。我试过下面这样的方法,但没用。我该怎么做?在

@objc.accessor    # i've also tried @objc.signature('v@:o^@')
def getFoos_range_(self, range):
    return self._some_array[range.location:range.location + range.length]

编辑:在苹果移动了所有文档之后,我终于找到了type encodings reference。看完之后,我试了一下:

^{pr2}$

但这似乎也没用。第一个参数应该是指向C数组的指针,但是长度在运行时之前是未知的,所以我不知道如何构造正确的类型编码。我试图'v@:N^[1000@]@'只是想看看,但也没用。在

我的模型对象绑定到驱动表视图的nsarray控制器的contentArray。它似乎根本没有调用这个方法,可能是因为它需要一个与桥提供的签名不同的签名。有什么建议吗?在


Tags: the对象方法模型selfrangelocation数组
1条回答
网友
1楼 · 发布于 2024-04-26 09:25:46

你很亲密。此方法的正确修饰符是:

@objc.signature('v@:o^@{_NSRange=QQ}')

NSRange不是一个对象,而是一个结构,不能简单地指定为@;您需要包括成员1。在

不幸的是,这还没有结束。经过大量的实验和对PyObjC源代码的研究,我最终发现为了让这个方法工作,您还需要为这个签名冗余的方法指定元数据。(不过,我还没弄明白为什么。)

这是使用函数objc.registerMetaDataForSelector完成的:

^{pr2}$

可以在PyObjC源代码中的文件^{}(以及附近的test_metadata*.py文件)中找到使用此函数的示例和一些详细信息。在

N.B.元数据必须在您感兴趣为其实现get<Key>:range:的任何类的超类上指定,并且需要在类定义结束之前的某个时间调用此函数(但无论是在class语句本身看来都可以工作)之前调用。我还没把这些东西弄明白。在

我将此元数据基于基础中NSArray getObjects:range:的元数据PyObjC.bridgesupport文件2,并通过参考苹果的BridgeSupport manpage来辅助。在

有了这一点,还值得注意的是,定义方法的最简单方法是(至少,IMO):

@objc.signature('v@:o^@{_NSRange=QQ}')
def get<#Key#>_range_(self, buf, inRange):
    #NSLog(u"get<#Key#>")
    return self.<#Key#>.getObjects_range_(buf, inRange)

也就是说,使用数组的内置getObjects:range:。在


1:在32位Python上,QQ,意思是两个unsigned long long,应该变成{},意思是两个unsigned ints
2: 位于(雪豹上)在:/System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/Foundation/PyObjC.bridgesupport在

相关问题 更多 >