How do you set up a block property that takes as an argument another block property so that auto-complete supplies all of the required parameters for both blocks?
To exp
The following code shows you how to set up blocks-within-a-block so that Xcode will auto-complete both the parameters and return values when you use the block:
In the header file:
typedef BOOL (^Condition)(void);
typedef void (^Success)(void);
typedef void (^Failure)(void);
typedef void (^Task)(Condition condition, Success success, Failure failure);
@property (copy, nonatomic, readwrite) Task task;
@property (copy, nonatomic, readwrite) Condition condition;
@property (copy, nonatomic, readwrite) Success success;
@property (copy, nonatomic, readwrite) Failure failure;
In the implementation file:
- (Task)task
{
return ^(Condition condition, Success success, Failure failure) {
if (condition())
{
success();
} else {
failure();
}
};
}
In the implementation file of any class granted access to the Task property, being typing the path to the property, as well as the property name itself, until Xcode auto-completes the rest:
AppServices.task(<#^BOOL(void)condition#>, <#^(void)success#>, <#^(void)failure#>)
Press the tab key to advance to the first parameter (condition
), and then press Return; repeat for the remaining two parameters (success
and failure
):
AppServices.task(^BOOL{
<#code#>
}, ^{
<#code#>
}, ^{
<#code#>
})
Replace code
with your code, making sure to return the appropriate value for any block that returns a non-void type )(condition
returns BOOL
):
[class].task(^BOOL{
return TRUE;
}, ^{
NSLog(@"TRUE");
}, ^{
NSLog(@"FALSE");
});
In this example, the Task block executes either the Success
or Failure
block depending on the return value of the conditional specified in the Condition
block.
My intended use is far more complex and pragmatic than this example; but, as far as "how to do it" goes, it will do.