そのため、バインド クラスでインターフェイスの実装NSFastEnumerable
を提供するためにプロトコル メソッドを接続するように btouch に自動的に指示する方法が見つかりませんでした。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);
}
上記InnerNativeSymbolSetHandle
で C 関数に渡すために使用したのは、私が 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
、プロトコルの関数にフックすることを介して)。objective NSFastEnumeration
-cがobjective-c forループを使用して一般的な方法でそれを行うことができる場合、確かにMonoTouchも自動的にフックできますか?