Site icon AppTractor

Понимаем @discardableResult в Swift

Swift известен тем, что в нем большое внимание уделяется безопасности типов и читаемости кода. Одним из свойств, соответствующих этим принципам, является атрибут @discardableResult. Этот атрибут позволяет пометить возвращаемое значение функции как «отбрасываемое» (discardable), что означает возможность игнорировать возвращаемое значение, не выдавая предупреждения компилятора. В этой статье мы рассмотрим, что такое отбрасываемый результат, почему он полезен и как эффективно использовать его в Swift.

Что такое отбрасываемый результат?

В Swift, когда вы вызываете функцию, возвращающую значение, компилятор ожидает, что вы что-то сделаете с этим значением. Однако существуют сценарии, в которых возвращаемое значение может быть не нужно, и его отбрасывание не представляет проблемы. В качестве примера можно привести функции, выполняющие действия, результат которых не нужен немедленно, например, логирование или уведомление.

Атрибут @discardableResult используется для указания компилятору Swift на то, что возвращаемое значение функции можно смело игнорировать, устраняя предупреждение, которое обычно возникает при отказе от использования значения, возвращаемого функцией.

Вот основной синтаксис использования @discardableResult:

@discardableResult
func someFunction() -> Int {
    // Function implementation
    return 42
}

В этом примере мы пометили функцию someFunction() как @discardableResult, что дает понять Swift, что можно вызвать эту функцию и не использовать ее возвращаемое значение.

Когда использовать @discardableResult

Атрибут @discardableResult особенно полезен в следующих сценариях:

1. Ведение логов и отладка

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

@discardableResult
func logEvent(message: String) -> Bool {
    // Log the event
    print(message)
    
    // Return true if the event was logged successfully
    return true
}

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

2. Гибкие интерфейсы

При построении текучих интерфейсов можно иметь методы, которые связываются в цепочку, но не требуют фиксации промежуточных результатов. Атрибут @discardableResult дает понять, что эти методы можно использовать без присвоения их результатов переменным.

@discardableResult
func addToCart(item: String) -> ShoppingCart {
    // Add the item to the shopping cart
    self.items.append(item)
    
    // Return the updated shopping cart
    return self
}

С помощью @discardableResult можно выстроить цепочку вызовов методов следующим образом:

let cart = ShoppingCart()
    .addToCart(item: "Product 1")
    .addToCart(item: "Product 2")

 3. Уведомления и колбеки

Функции, запускающие уведомления, обратные вызовы или методы делегатов, часто возвращают значения, указывающие на успех или неудачу. Однако в некоторых случаях нет необходимости сразу проверять возвращаемое значение. Пометка таких возвращаемых значений как отбрасываемых позволяет повысить ясность кода.

@discardableResult
func sendNotification(message: String) -> Bool {
    // Send a notification
    NotificationCenter.default.post(name: .notificationName, object: nil, userInfo: ["message": message])
    
    // Return true if the notification was sent successfully
    return true
}

Используя @discardableResult, можно отправлять уведомления без необходимости явного перехвата возвращаемого значения.

Заключение

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

Exit mobile version