Немного избитых и не избитых советов для того, чтобы компилятор мог сделать немного больше статической диспетчеризации вместо динамической.
Используем final для классов
final class A() { ... }
Используем private и fileprivate для типов, свойств и методов
private class B() {
func doSomething() { ... }
}
Если у класса
B нет детей, то вызов doSomething() в этом же файле может быть заменен на статический даже без final.И это то, о чем не так и редко забывают разработчики. Уровни доступа - не просто красивый API, но и увеличение скорости работы приложения.