Результат вызова функции [myFunction] не используется.

В Obj-C распространенной практикой было использование удобных функций для выполнения общих операций, таких как настройка автоматического макета для просмотров:

func makeConstraint(withAnotherView : UIView) -> NSLayoutConstraint
{
   // Make some constraint 
   // ...

   // Return the created constraint
   return NSLayoutConstraint()
}

Если вам просто нужно установить ограничение и забыть об этом, вы можете позвонить:

[view1 makeConstraint: view2]

Если вы хотите сохранить ограничение позже, чтобы вы могли его удалить или изменить, вы бы сделали что-то вроде:

NSLayoutConstraint * c;
c = [view1 makeConstraint: view2]

Я хочу сделать это быстро, но если я вызову вышеуказанную функцию и не захватить возвращаемое ограничение, я получаю предупреждение:

Result of call to 'makeConstraint(withAnotherView:)' is unused

ОЧЕНЬ раздражает. Есть ли способ сообщить Свифту, что я не всегда хочу получить возвращаемое значение?

ПРИМЕЧАНИЕ. Я знаю об этом. Это уродливо, а не то, что я ищу:

_ = view1.makeConstraint(withAnotherView: view2)

Ответ 1

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

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

@discardableResult
func makeConstraint(withAnotherView : UIView) -> NSLayoutConstraint {

   ... // do things that have side effects

   return NSLayoutConstraint()
}

view1.makeConstraint(view2) // No warning

let constraint = view1.makeConstraint(view2) // Works as expected

Вы можете прочитать об этом изменении более подробно в проекте эволюции.

Ответ 2

Вы можете попытаться отключить предупреждения от настроек сборки вашего проекта. Мне нравится вопрос, хорошая точка. Сделали некоторые исследования и нашли это. fooobar.com/info/64248/...

Не тестировал еще.