We all know what the final keyword to a class/property is for.

  1. To prevent overriding (obvious)
  2. To optimize runtime

This optimization tip provided by Apple explains how it optimizes runtime by directly accessing a class/property without a (virtual) vtable lookup.

However, most developers did not know the compiler is smart enough to automatically infer the final keyword.

It was explained in Apple’s blog.

1. Need NOT add for private

If you declare a class/property as private, or fileprivate, their visibility are already restricted to the current file. Read this on Swift access levels.

The compiler is smart enough to infer them as final. Adding the keyword is redundant.

2. Need NOT add for internal

The compiler can also infer for the default internal access level, but only if you enable Whole Module Optimization (WMO) under Building Settings > Compilation Mode > Whole Module.

What WMO does is that all the files are optimized TOGETHER, therefore the compiler can infer across all.

All Release build configuration should have it enabled, so that it optimizes for runtime. While your Debug build config might not have it, it is okay.

3. Only add for public

But if you have public, then you’re likely providing a library that will be used by others.

In that case, the compiler cannot infer. So if you’re sure the class/property is not override-able, then you should add final to achieve optimization.

Just 1 scenario where you need to add final. So please don’t add everywhere 😄




Back to Home