Получи случайную криптовалюту за регистрацию!

Про малоизвестный литерал #function Литерал #function появилс | Mika.MA_IT

Про малоизвестный литерал #function

Литерал #function появился довольно давно, в Swift 3, если не ошибаюсь. Этот литерал – это String значение, которое соответствует имени функции, которой он принадлежит. В Swift 5 его логика незначительно изменилась. Вот к примеру: https://stackoverflow.com/questions/45086137/weird-value-of-function-literal-in-swift-3-1

Я вспомнила о #function, когда мне в руки попал проект команды, которая постоянно его использует для логов.

К примеру, имеем функцию, в которой есть вывод логов с упоминание имени самой функции:

func calculateSomething() {
print("calculateSomething() is running")
}

Если мы решил изменить имя функции, нам придется вручную обновить все строки логов. Чтобы этого избежать, можно использовать #function:

func calculateSomething() {
print(#function + " is running")
}

Вывод будет идентичен выводу куска кода выше. Просто, удобно и красиво.

С другой стороны, с такими литералами надо быть осторожными в том случае, если изменение имени функции может повлиять на работу приложения. Например:

extension UserDefaults {
var rememberUser: Bool {
get { bool(forKey: #function) }
set { set(newValue, forKey: #function) }
}
}

В этом куске кода мы сохраняем значение в UserDefaults по ключу, который соответствует имени переменной, а именно rememberUser.

Проблема в том, что, если в какой-то момент мы решим переименовать переменную в нашем коде, то это сломает обратную совместимость с существующим приложением, так как ключ для хранения данных изменится.

В этом примере мы видим, что важно учитывать предназначение литералов. Разработчик должен иметь возможность изменить имя переменной, и никакой функционал не должен ему в этом мешать. А #function должно использоваться так, чтоб давать преимущество в случае изменения имени функции, как это показано в примере логов.

Если вам было интересно узнать о литералах, можете так же почитать про #file, #line, #column и другие в этой документации в разделе Literal Expression: https://docs.swift.org/swift-book/ReferenceManual/Expressions.html