Думаю, все мы, кто пишет на Swift хоть изредка, пользовались такой конструкцией языка как блоки. Но есть один нюанс с этими блоками, который сильно раздражает: в Xcode не совсем корректно работает форматирование кода по отношению к ним, а точнее — страдают отступы.
Страдают в том случае, если блок многострочный и указан как один из параметров при вызове метода, а форматирование кода — построчное, то есть, параметр указан на отдельной строке.
Вот в таком случае, самом простом и типичном, форматирование работает хорошо:
DispatchQueue.main.async {
// ok
}
DispatchQueue.main.async(execute: {
// ok
})
Но стоит перенести указание параметра на отдельную строку, как начинается дискотека:
DispatchQueue.main.async(
execute: {
// wrong
}
)
Однако, если добавить захват, то все работает наура:
DispatchQueue.main.async(
execute: { [weak self] in
// ok
}
)
DispatchQueue.main.async(
execute: { [unowned self] in
// ok
}
)
О проблеме я в Apple отписывал, да и похоже, что они о ней уже давно знают.
Вот у себя мне приходится пользоваться захватом, просто чтобы сохранить форматирование.
К сожалению, кроме решения основной проблемы, этот способ порождает проблему другую — warnings о том, что self не используется внутри блока. Но лично мне проще смириться с такими warnings, чем наблюдать сбитые отступы.
Если кто-то не знал и кому-то заметка окажется полезной, то хорошо.
Если кто-либо знает, как описанную проблему можно решить более лаконично, буду рад узнать.
Автор: Станислав Потемкин