#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.