discuss-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: GSPredicate


From: David Chisnall
Subject: Re: GSPredicate
Date: Mon, 18 Jun 2018 16:59:13 +0100

On 18 Jun 2018, at 16:49, amon <amon@vnl.com> wrote:
> 
> So you are saying this would be good to go?
> 
> NSUInteger i;
> NSMutableArray *a;
> NSEnumerationOptions opts;
> GSPredicateBlock      predicate = ^() { return YES; }
> 
> i = [a indexOfObjectWithOptions: opts passingTest: predicate];

No, because that block does not take the correct number of arguments.  It might 
compile, but it would be undefined behaviour.  You must define a block that 
takes three arguments:

- The object being inspected
- The index of the object.
- A pointer to a BOOL that is used to stop early

You can see these types here:

https://github.com/gnustep/libs-base/blob/6c388830dac190452dd3bce617139a552d78519e/Headers/Foundation/NSArray.h#L177

        

        DEFINE_BLOCK_TYPE(GSPredicateBlock, BOOL, GS_GENERIC_TYPE(ElementT),
  NSUInteger, BOOL*);

BOOL is the return type of the block.

GS_GENERIC_TYPE(ElementT) is an ugly macro that allows us to use generic types 
with modern compilers and fall back to id for older ones.  The type of the 
first argument to the block is therefore either id (for older compilers or for 
arrays that don’t use generics) or the generic type of the NSArray (e.g. 
NSString for NSArray<NSString>).

NSInteger and BOOL* are the types of the next two arguments.

David




reply via email to

[Prev in Thread] Current Thread [Next in Thread]