Защита с завершающим замыканием — быстрый синтаксис

#swift #xcode #closures

#swift #xcode #замыкания

Вопрос:

Допустим, у меня есть функция, которая принимает замыкание в качестве последнего параметра, поэтому ее можно сократить до примерно такого:

 let reminder = reminders.first { (reminder) -> Bool in
    return reminder.mealIdentifier == mealIdentifier
}
 

Потрясающе! Теперь, допустим, я хочу поместить это в guard оператор, например:

 guard let reminder = reminders.first { (reminder) -> Bool in
    return reminder.mealIdentifier == mealIdentifier
} else {
    continue
}
 

В тот момент, когда я это делаю, компилятор начинает кричать. Исправление заключается в том, чтобы не использовать завершающий короткий синтаксис закрытия при вызове функции, но это громоздко, поскольку автоматическое завершение по умолчанию с помощью Xcode не имеет возможности НЕ выполнять завершающие короткие синтаксисы замыкания, когда ваш последний параметр является закрытием:

 guard let reminder = reminders.first(where: { (reminder) -> Bool in
   return reminder.mealIdentifier == mealIdentifier
}) else {
    continue
}
 

Есть ли что-нибудь, чего мне здесь не хватает? Или есть способ каким-то образом заставить Xcode выполнять автозаполнение без сокращенного синтаксиса?

Ответ №1:

Или есть способ каким-то образом заставить Xcode выполнять автозаполнение без сокращенного синтаксиса?

Xcode довольно умен. Он выбирает версию закрытия без завершения, если вы выполняете автоматическое завершение в инструкции потока управления, для которой требуется . { Например, если я наберу:

 guard let a = reminders.first
 

Автоматическое завершение показывает:

введите описание изображения здесь

Если я выберу выделенный вариант, я получу:

 guard let a = reminders.first(where: <#T##(String) throws -> Bool#>)
 

введите описание изображения здесь

Если я затем нажму enter, я получу:

 guard let a = reminders.first(where: { (<#String#>) -> Bool in
    <#code#>
})
 

введите описание изображения здесь

Это не превращает его в завершающее замыкание, если вы выполняете автозаполнение в операторе guard / if.