Xcode Search: the Hidden Gems
As software developers, we spend a surprisingly large amount of time reading code. Robert C. Martin points this out in Clean Code:
Indeed, the ratio of time spent reading versus writing is well over 10 to 1. We are constantly reading old code as part of the effort to write new code.
Reading through the whole codebase is just not practical. When you join a new project, browse through some open source library or just work on a large codebase, search becomes an immensely useful part of your toolkit. So, let's dive in into some hidden 💎 of Xcode's Find Navigator.
#1: Patterns
Searching for text in Xcode is quite easy. Type Command-Shift-F and off you go. That's not enough, though, when we want to perform a more advanced search. If, say, we wanted to search for strings containing URLs we'd end up with a pretty complicated regular expression. This is so common case, that Apple decided to help us by introducing the ability to search for wildcard patterns.
To do that, we start by clicking on the loupe button with the disclosure indicator next to it:
Then, we are presented with the list of the available patterns:
Clicking on a pattern inserts it into the search field. Just like that we got a list of strings representing URLs:
Patterns are a good middle ground between simple text searches and regular expression.
#2: Definitions
Xcode also provides search options leveraging its understanding of the code structure. Let's say, we want to find all singletons that crept into our project. We'll use a heuristic here by assuming that all of them have methods or properties named shared*
.
If we simply search for shared
we get a lot of results:
To narrow the results we have to click on Text (which doesn't look like a clickable element!) and choose Definitions instead:
And we're done!
With Definitions filter we can also search for a class, struct, and enum names; enum cases and more.
#3: Search Scopes
Choosing a project or a group that we want to search in is often enough:
Let's imagine that we work in a mixed Objective-C/Swift codebase. (It wasn't that hard to imagine, right? 😉). We want to search for something only in Swift files. We can do that easily thanks to custom Search Scopes. Click on New Scope... button and limit your search results by filtering for: Location, Name, Path, Path Extension and Type. Type seems like a great fit for our search but unfortunately, there isn't Swift on the list:
Instead of that, though, we can filter by Path Extension, like this:
#4: Call Hierarchy
A recent feature added in Xcode 7, is an ability to search call hierarchies. With it, we can get a high-level overview of how our method or function is used. I don't use it often but when I do it tends to save a lot of time.
When Not to Search
As you can see, Find navigator in Xcode is pretty great. Searching isn't always the best solution to find what we're looking for, though. For example, when we have a cursor over some property it's better to click Command-Control-J to jump to its definition than use search. Or when we want to see who calls a method we can check Callers in Related Items (Control-1) menu without even leaving the text view.
Conclusion
Search in Xcode gets more and more powerful each year. It helps us find and understand our own and third-party code. As with all other tools (or anything in life), it comes with some tradeoffs. We have to remember to use the best tool for the job.