Before you relieve the itching in your fingertips, I already understand:
try
keywordtry
, try?
, and try!
keywordsWhat I want to understand is what the use of the unadorned try
keyword buys me (and you and all of us) over and above merely quieting a compiler diagnostic. We're already inside the scope of a do
, and clearly the compiler knows to demand a try
, and I can't (yet) see how there might be some ambiguity about where the try
needs to land. So why can't the compiler quietly do the right thing without the explicit appearance of the keyword?
There's been a fair amount of discussion (below) about the possibility that the language is trying to enforce readability for humans. I guess we'd need the input from one of the Swift language designers to determine whether that's true. And even if we had that it would be debatable whether it's wise and/or has been a success. So let's put that aside for the moment. Does the existence of the un-adorned try
keyword solve some problem other than enforcing readability for humans?
After a long, productive discussion (linked elsewhere on this page)…
In short, the answer is no, there isn't a purpose other than enforcing readability, but it turns out the readability win is more significant than I had realized.
The try
keyword should be seen as akin to (though not the equivalent of) a combination of if
and goto
. Although try
doesn't direct the compiler to do anything it could not have inferred it should do, no one would argue that an if
or a goto
should be invisible. This makes try
a little weird for folks coming from other languages — but not unreasonably so.
It may be difficult for Objective C programmers to grasp this because they are accustomed to assuming almost anything they do may raise an exception. Of course, Objective C exceptions are very different from Swift errors, but knowing this consciously is different from metabolizing it and knowing it unconsciously.
As well, if your intuition immediately tells you that as a matter of style in most cases there should probably be only one failable operation inside a do
clause, it may be difficult to see what value a try
adds.