if let

How not to use it

Swift Semantic My past self

I always struggle at writing a short post for my tip section. Most of my article starts as an idea for my tip section, and then it grows into a long one. So today, I come up with a new tag, my past self. I will share an example and mistake I made or see. I think it will fit well into the tip section.

Today I will talk about how not to use if let.

When I wrote this, only God and I understood what I was doing.
Now, only God knows.

Problem

I got an optional object with an optional property.

struct User {
let name: String
let address: Address?
}

let user: User? = User(name: "John", address: nil)

There is a time where I need to check for the presence of an object property so I can treat it differently.

Without much thought, some time, my muscle memory will write something like this.

if let user = user, let address = user.address {
// Some logic that use `user`, but not `address`
}

I'm in a hurry, so I ignore the Xcode warning. Many months passed by coming back to refactor my code, and I see this warning.

Value never used warning
Immutable value 'address' was never used; consider replacing with '_' or removing it. Replace 'address' with '_'

I follow the solution and remove it.

if let user = user {
// Some logic that use `user`, but not `address`
}

A few minutes later, my CI failed. My UI tests failing, and I spent minutes fixing it.

What my past self should do

Instead of abusive use of let address = user.address, I should write in a way that expresses the real intent.

... to check for the presence of an object property ...

I should write it like this.

if let user = user, user.address != nil {
// Some logic that use `user`, but not `address`
}

Conclusion

By using language features correctly, you do colleagues and your future self a favor. A little bit of thought at a very early stage can save you significant time in the future.

If you enjoy this article, you can subscribe to the weekly newsletter.

Every Friday, you’ll get a quick recap of all articles and tips posted on this site — entirely for free.


← Home