Думаю, все мы, кто пишет на 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, чем наблюдать сбитые отступы.

Если кто-то не знал и кому-то заметка окажется полезной, то хорошо.
Если кто-либо знает, как описанную проблему можно решить более лаконично, буду рад узнать.

Комментарии (5)


  1. Sie
    02.09.2017 11:04
    +4

    Даже хз, статья ниочем, ну косячно форматирует и что теперь? не в форматирвоании же смысл. Вот если неработало как заявлено, другое дело. Вы бы еще про подсветку синтаксиса написали что цвет не устраивет.


  1. Sashk1n
    02.09.2017 11:05

    Такую проблему решаю с помощью AppCode. Да и вообще это не самая худшая их недоработка в XCode к сожалению…


    1. Roman_Podymov
      02.09.2017 18:37

      Опишите тогда, как обстоят дела с форматированием блоков в AppCode.


      1. FirsofMaxim
        02.09.2017 20:46

        Там все прекрасно, попробуйте.


        1. house2008
          03.09.2017 19:21

          Вы rxswift используете? аппкод не видит проперти биндинги к эпловым классам, например tableView.rx. и дальше не работает, только показывает базовые методы, хотя в тоже время если написать по памяти то потом в дефинишен переходит без проблем. Поэтому постоянно пишу в обоих IDE, пока в одном автокоплишен отваливается или подсветка синтаксиса пишу в другом и на оборот.