Swift TIL 10
Posted on 2020-07-05 15:27 +0100 in TIL • 2 min read
My leisurely journey into getting to know Swift by reading and then making
notes to myself in my blog continues, and this weekend I encountered
defer
. As I was reading about Swift I did keep wondering when something
like try
(it has try
), catch
(it has catch
) and finally
(it
doesn't have finally
, but...) might crop up. This weekend I hit the part
of the book that covered this sort of thing.
Given Swift's apparent general reliance on not throwing errors but instead
using Optional
and nil
to signify issues, it sort of came as no surprise
that its approach to implementing something like try
...finally
is
actually divorced from try
. I'm not sure how I feel about it yet, but
defer
makes sense.
Here's an utterly useless bit of code that demonstrates how it works:
func add( _ n1 : Int, _ n2 : Int ) -> Int {
defer {
print( "Huh! We did some adding!" )
}
print( "About to do the add and then return" )
return n1 + n2
}
print( add( 2, 2 ) )
When run, the output is this:
$ swift run
[3/3] Linking try-defer
About to do the add and then return
Huh! We did some adding!
4
A defer
(and there can be multiple) is tied to the block that it's
declared in, and is executed when the block exits. This is, of course, going
to be really handy for things like resource-management where you don't want
to be leaking something, although I can imagine a few other uses too (none
of which are really going to be novel for someone who's coded in other
languages with similar constructs).
What I find interesting about this is that one or more defer
blocks can be
declared at various locations within a block of code; this obviously makes
sense in that you might not want to be handling the tidy-up of something
you've not got around to creating yet. But there's also part of me feels
uneasy about the "exit" code being declared further up the body of code,
rather than down towards the end. On the other hand I think I do appreciate
the idea of, up front, writing "look, any time there's a GTFO in the code
that follows, this will happen" -- you're made aware pretty quickly of what
to expect.
Anyway, it's good to know Swift has something similar to a finally
.