我正在尝试为ZBar库编写MonoTouch绑定并且卡在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
接口绑定到NSFastEnumerator
协议实现时,问题就开始了。我真的不知道从哪里开始。
答案 0 :(得分:2)
所以我没有找到一种自动方式来指示btouch挂钩NSFastEnumerable
协议方法以在绑定类上提供IEnumerable
接口实现。相反,我采用手动方法,并添加了我自己的部分类与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类上的属性,幸运的是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函数,而是通过挂钩countByEnumeratingWithState
协议的NSFastEnumeration
函数。如果objective-c可以在使用objective-c for循环的通用方式,那么MonoTouch肯定会自动挂钩吗?