I'm trying to implement search filtering for a data source that is used to populate a UITableView
.
Basically, I'm trying to allow people to put in multiple words and split that one string into tokens and then iterate through each object in the datasource to see if I can find all of the search tokens anywhere in an object's properties or sub-properties.
If the user simply types in multiple words separated by spaces, this is a trivial case of using -componentsSeparatedByString:
.
I'm trying, however, to also solve the case where a user might put in a comma-separated list of items.
So, the easy entry to tokenize is this:
"word1 word2 word3"
I want to also be able to tokenize this:
"word1, word2, word3"
The problem I see is that, because I don't assume that the user will enter commas, I can't simply replace/remove white space.
I see some kludgy ways to implement what I want, which basically consists of splitting first on white space, then iterating that array, splitting on commas, then iterating the overall array, removing "empty" tokens. I think this would work, but I was hoping for a more elegant way to do this, especially since I might decide to add a third delimiter at some point, which would make this solution exponentially more complex.
So far, I'm intrigued by using NSCharacterSet
in combination with -componentsSeparatedByCharactersInSet
. I'm having trouble with this method, though.
Here's what I'm trying so far:
NSMutableCharacterSet *delimiters = [NSMutableCharacterSet characterSetWithCharactersInString:@","];
[delimiters addCharactersInString:@" "];
NSArray *tokens = [searchText componentsSeparatedByCharactersInSet:delimiters];
The problem I'm encountering is this:
Suppose searchText
(above) is "word,". In that case, my tokens
array becomes this:
[@"word", @""]
So, even trying this out, it would appear (at first glance) that I would still have to iterate the tokens
array to remove empty items. Again, this is possible, but I have a feeling there's a better way.
Is there a better way? Am I misusing NSCharacterSet
?