// Objective-C API for talking to ignore Go package.
//   gobind -lang=objc ignore
//
// File is generated by gobind. Do not edit.

#ifndef __Ignore_H__
#define __Ignore_H__

@import Foundation;
#include "ref.h"
#include "Universe.objc.h"


@class IgnoreS;
@protocol IgnoreI;
@class IgnoreI;

@protocol IgnoreI <NSObject>
// skipped method I.Argument with unsupported parameter or return types

// skipped method I.Result with unsupported parameter or return types

@end

@interface IgnoreS : NSObject <goSeqRefInterface, IgnoreI> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (instancetype)init;
// skipped field S.F with unsupported type: interface{}

// skipped method S.Argument with unsupported parameter or return types

// skipped method S.Result with unsupported parameter or return types

@end

// skipped const Cuint with unsupported type: uint

// skipped const Cuint32 with unsupported type: uint32

// skipped const Cuint64 with unsupported type: uint64

// skipped const NamedConst with unsupported type: ignore.NamedString


@interface Ignore : NSObject
// skipped variable C128 with unsupported type: complex128

// skipped variable C64 with unsupported type: complex64

// skipped variable Uint with unsupported type: uint

// skipped variable Uint32 with unsupported type: uint32

// skipped variable Uint64 with unsupported type: uint64

// skipped variable V with unsupported type: interface{}

// skipped variable Var with unsupported type: interface{}

@end

// skipped function Argument with unsupported parameter or return types


// skipped function Result with unsupported parameter or return types


@class IgnoreI;

@interface IgnoreI : NSObject <goSeqRefInterface, IgnoreI> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
// skipped method I.Argument with unsupported parameter or return types

// skipped method I.Result with unsupported parameter or return types

@end

#endif
