Поскольку вам может потребоваться измерить разные функции, вероятно, имеет смысл захватывать аргументы для функции в замыкании, а не включать их типы в сигнатуру.Но я использовал универсальный тип для возвращаемого значения.Я надеюсь, что это то, что вам нужно:
func measure<R>(_ label: String, operation: () -> R) -> R {
let start = DispatchTime.now()
let result = operation()
let end = DispatchTime.now()
let nanoTime = end.uptimeNanoseconds - start.uptimeNanoseconds
let timeInterval = Double(nanoTime) / 1_000_000_000
print(String(format: "%@: %.9f s", label, timeInterval))
return result
}
Вот как вы его используете:
let result = measure("search") { binarySearchForValue(searchValue: 3, array: [1, 3, 8]) }
print(result) // that's the result of the function that was measured, not the measurement
measure("some function") { functionWithoutReturnValue() }
Если функция не имеет возвращаемого значения, R
будет ()
, так что это должно работать тоже.Просто не присваивайте результат чему-либо (см. Пример выше).Если вы хотите сделать что-то с измерением, отличным от его печати на консоли, вы можете сделать это тоже.Но вы не указали это в своем вопросе, поэтому я пошел с print
.