-
Notifications
You must be signed in to change notification settings - Fork 268
Typhoon Option Matcher
Imagine you have several implementations of a protocol or sub-classes of an abstract base class, and the one that is appropriate to use is not known until run-time. This reasonably common requirement, and its quite easy to configure Typhoon for this.
To return an one definition or another based on information at run-time, create a definition as follows:
- (UIViewController *)dealerBrowserController
{
return [TyphoonDefinition withOption:[self.coreComponents currentDealers]
matcher:^(TyphoonOptionMatcher *matcher) {
[matcher caseEqual:nil use:[self dealerLoadingViewController]];
[matcher defaultUse:[self dealerBrowserControllerForLoggedInUser]];
}];
}
In the above example one view controller or another is returned, depending on the current state of currentDealers
in a collaborating assembly.
Its also possible to use a run-time argument to specify which instance is returned. For example:
- (RCAEventInfoBlockDirector *)directorWithClassType:(NSNumber *)classType {
return [TyphoonDefinition withOption: classType matcher:^(TyphoonOptionMatcher *matcher) {
[matcher caseEqual:1 use:[self directorForType1]];
[matcher caseEqual:2 use:[self directorForType2]];
[matcher defaultUse:[self defaultDirector]];
}];
}
Options can be of any type and the isEqual
method will be used for matching.
If the argument of TyphoonOptionMatcher
is a BOOL value, than you can use a simplified syntax:
- (LoggingService *)loggingService {
return [TyphoonDefinition withOption:@(DEBUG)
yes:[self debugLoggingService]
no:[self releaseLoggingService]
];
}
Something still not clear? How about posting a question on StackOverflow.
Get started in two minutes.
Get familiar with Typhoon.
- Types of Injections
- What can be Injected
- Auto-injection (Objective-C)
- Scopes
- Storyboards
- TyphoonLoadedView
- Activating Assemblies
Become a Typhoon expert.
For contributors or curious folks.