gpt4 book ai didi

c# - 将实现 NSFastEnumeration 协议(protocol)的 Obj-C 类型绑定(bind)到 MonoTouch

转载 作者:太空宇宙 更新时间:2023-11-03 11:24:03 26 4
gpt4 key购买 nike

我正在尝试为 ZBar 库编写 MonoTouch 绑定(bind),但卡在 ZBarSymbolSet 类型上。乍一看很简单:

@interface ZBarSymbolSet
: NSObject <NSFastEnumeration>
{
const zbar_symbol_set_t *set;
BOOL filterSymbols;
}

@property (readonly, nonatomic) int count;
@property (readonly, nonatomic) const zbar_symbol_set_t *zbarSymbolSet;
@property (nonatomic) BOOL filterSymbols;

- (id) initWithSymbolSet: (const zbar_symbol_set_t*) set;

@end


@interface ZBarSymbol : NSObject
... I've left out the ZBarSymbol members, all thats important is that the ZBarSymbolSet should be an IEnumerable<ZBarSymbol>
@end

但是当我开始研究如何将标准 .NET IEnumerable 接口(interface)绑定(bind)到 NSFastEnumerator 协议(protocol)实现时,问题就来了。我真的不知道从哪里开始。

最佳答案

所以我没有找到一种自动方法来指示 btouch 连接 NSFastEnumerable 协议(protocol)方法以在绑定(bind)类上提供 IEnumerable 接口(interface)实现。相反,我采用了手动方法,并添加了我自己的带有 IEnumerable 实现的部分类。在这个过程中,我不得不直接调用这个 Obj-C 库包装的 C 库!

public partial class ZBarSymbolSet : IEnumerable<ZBarSymbol>
{
public IEnumerator<ZBarSymbol> GetEnumerator ()
{
IntPtr symbol;
if ( FilterEnabled )
symbol = zbar_symbol_set_first_symbol(this.InnerNativeSymbolSetHandle);
else
symbol = zbar_symbol_set_first_unfiltered(this.InnerNativeSymbolSetHandle);

while ( symbol != IntPtr.Zero )
{
yield return new ZBarSymbol(symbol,0);
symbol = zbar_symbol_next(symbol);
}
}

IEnumerator IEnumerable.GetEnumerator ()
{
return GetEnumerator();
}

[DllImport("__Internal")]
private extern static IntPtr zbar_symbol_next(IntPtr zBarSymbol);

[DllImport("__Internal")]
private extern static IntPtr zbar_symbol_set_first_symbol(IntPtr zbarSymbolSet);

[DllImport("__Internal")]
private extern static IntPtr zbar_symbol_set_first_unfiltered(IntPtr zbarSymbolSet);
}

上面用于传递到 C 函数中的 InnerNativeSymbolSetHandle 是我在 ZBarSymbolSet 类上绑定(bind)的一个属性,幸运的是 ZBar iPhone SDK 作者公开了指向 C ZBar 库中的底层结构的指针:

// @interface ZBarSymbolSet : NSObject <NSFastEnumeration>
[BaseType (typeof(NSObject))]
interface ZBarSymbolSet
{
// @property (readonly, nonatomic) int count;
[Export("count")]
int Count { get; }

// @property (readonly, nonatomic) const zbar_symbol_set_t *zbarSymbolSet;
[Export("zbarSymbolSet")]
IntPtr InnerNativeSymbolSetHandle{ get; }

// @property (nonatomic) BOOL filterSymbols;
[Export("filterSymbols")]
bool FilterEnabled { get; set; }
}

所以这是手动解决方案。
我仍然希望 btouch 有一种自动方法来执行此操作(显然不是通过这些 C 函数,而是通过挂接到 NSFastEnumeration 协议(protocol)的 countByEnumeratingWithState 函数。如果 objective-c 可以使用 objective-c for 循环以通用方式完成它,那么 MonoTouch 肯定也可以自动挂接到它吗?

关于c# - 将实现 NSFastEnumeration 协议(protocol)的 Obj-C 类型绑定(bind)到 MonoTouch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10057343/

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