首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将实现NSFastEnumeration协议的Obj-C类型绑定到MonoTouch

将实现NSFastEnumeration协议的Obj-C类型绑定到MonoTouch
EN

Stack Overflow用户
提问于 2012-04-08 02:51:54
回答 1查看 952关注 0票数 2

我正在尝试为ZBar库编写一个MonoTouch绑定,但在ZBarSymbolSet类型上遇到了问题。乍一看,它看起来非常简单:

代码语言:javascript
复制
@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协议实现时,问题就开始了。我真的不知道从哪里开始。

EN

回答 1

Stack Overflow用户

发布于 2012-04-08 21:25:30

因此,我没有找到一种自动的方法来指示btouch连接NSFastEnumerable协议方法,以便在绑定类上提供IEnumerable接口实现。相反,我采用了手动方法,并使用IEnumerable实现添加了我自己的分部类。在这里面,我不得不直接调用这个Obj-C库包装的C库!

代码语言:javascript
复制
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库中底层结构的指针:

代码语言:javascript
复制
// @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协议的countByEnumeratingWithState函数。如果objective-c可以使用objective-c for循环以一种通用的方式来做这件事,那么MonoTouch当然也可以自动挂接到它中?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10057343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档