#pragma mark в Swift?

810

В Objective C я могу использовать #pragma mark для обозначения разделов моего кода в навигаторе символов. Поскольку это команда препроцессора C, она недоступна в Swift. Есть ли в Swift возможность для этого, или мне нужно использовать уродливые комментарии?

  • 13
    Это действительно важно для организации нашего длинного кода.
  • 0
    Похоже, что быстро заметной разницы между комментариями и разметкой разделов больше нет. Расширения не названы, поэтому кажется, что отдельные файлы - единственный способ провести различие между двумя типами комментариев.
Показать ещё 7 комментариев
Теги:
xcode

19 ответов

1023
Лучший ответ

Вы можете использовать //MARK:


Также было обсуждение, что либеральное использование расширений классов могло бы быть лучшей практикой в любом случае. Поскольку расширения могут реализовывать протоколы, вы можете, например, поместить все методы делегата табличного представления в расширение и сгруппировать свой код на более семантическом уровне, чем способный #pragma mark.

  • 61
    И да, новое соглашение с разработчиками позволяет нам говорить об этом :)
  • 4
    Вы не можете использовать расширения для хранения протокола, который имеет метод init, такой как NSCoding. Это затрудняет разделение, если вы не можете использовать его во всех случаях.
Показать ещё 14 комментариев
169

Для тех, кто заинтересован в использовании расширений vs pragma marks (как упоминалось в первом комментарии), вот как реализовать его у Swift Engineer:

import UIKit

class SwiftTableViewController: UITableViewController {

    init(coder aDecoder: NSCoder!) {
        super.init(coder: aDecoder)

    }

    override func viewDidLoad() {
        super.viewDidLoad()

    }
}

extension SwiftTableViewController {
    override func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
        return 1
    }

    override func tableView(tableView: UITableView?, numberOfRowsInSection section: Int) -> Int {
        return 5
    }

    override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell? {
        let cell = tableView?.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as UITableViewCell;

        cell.textLabel.text = "Hello World"

        return cell
    }

}

Это также не обязательно лучшая практика, но это то, как вы это делаете, если хотите.

  • 5
    Это очень круто, но было бы неплохо, если бы расширения могли иметь имена.
  • 0
    Другая проблема заключается в том, что он не будет работать для всех протоколов, таких как NSCoding. Методы init не могут входить в расширения.
Показать ещё 18 комментариев
152

До Xcode 5 существовала препроцессорная директива #pragma mark.

Из Xcode 6 on вы должны использовать // MARK:

Эти функции препроцессора позволяют принести некоторую структуру в раскрывающееся окно функции редактора исходного кода.

несколько примеров:

// MARK:

- > будет предшествовать горизонтальный делитель

// MARK: your text goes here

- > помещает 'ваш текст идет здесь' выделен жирным шрифтом в выпадающем списке

// MARK: - your text goes here

- > помещает 'ваш текст идет здесь' выделен жирным шрифтом в выпадающем списке, которому предшествует горизонтальный разделитель

update: добавлен снимок экрана, потому что у некоторых людей по-прежнему возникают проблемы с этим:

Изображение 1564

  • 1
    В XCode 6.1.1 нет разделителей, использующих // MARK: - text для меня, и в раскрывающемся списке отображается MARK: текст вместо просто текста .
  • 0
    у меня нормально работает в Xcode 6.1.1, я только что добавил скриншот - пожалуйста, уточните свой код?
Показать ещё 3 комментария
108

Pragma mark - [SOME TEXT HERE] использовался в Objective-C для группировки нескольких функций путем разделения строк.

В Swift вы можете достичь этого, используя MARK, TODO OR FIXME

я. MARK: //MARK: viewDidLoad

Это создаст горизонтальную линию с функциями, сгруппированными под viewDidLoad (показано на снимке 1)

Изображение 1565

II. TODO: //TODO: - viewDidLoad

Это будет группировать функцию в категории TODO: - viewDidLoad (показано на скриншоте 2)

Изображение 1566

III. FIXME: //FIXME - viewDidLoad

Это будет группировать функцию в категории FIXME: - viewDidLoad (показано на скриншоте 3)

Изображение 1567

  • 2
    Спасибо, это работает для XCode 7 и Swift 2.0
  • 0
    Обратите внимание, что "-" после TODO и FIXME ничего не делают. «-» относится только к директиве MARK.
56

В Objective-C код Xcode обнаруживает такие комментарии, как // MARK: - foo, который немного переносится, чем #pragma. Но, похоже, они тоже не подобраны (пока?).

Изменить: Исправлено в Xcode 6 beta 4.

  • 6
    Я очень надеюсь, что они сделают это доступным в ближайшее время, потому что мне нравится держать все организованным с прагматическими отметками>.
  • 1
    Я могу подтвердить, что // MARK: - на данный момент не работает.
Показать ещё 9 комментариев
36

Я думаю, Extensions - лучший способ вместо #pragma mark.

Код перед использованием Extensions:

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
    ...

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        ...
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        ...
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        ...
    }
}

Код после использования Extensions:

class ViewController: UIViewController {
    ...
}

extension ViewController: UICollectionViewDataSource {
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        ...
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        ...
    }
}

extension ViewController: UICollectionViewDelegate {
    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
       ...
    }
}
  • 5
    Я думаю, что его потенциал намного больше, чем прагмы, но в настоящее время прагмы все еще лучше, потому что расширение не показывает имена протоколов или пользовательских имен в выпадающем меню, как это делают прагмы ( см. Ответ Whasssaaahhh ниже )
  • 0
    Новый код "// MARK:" полезен, но мне также нравится ваш наглядный пример того, как использовать расширения - особенно для делегированных функций!
Показать ещё 2 комментария
35

Теперь Xcode 8 обрабатывает его, как показано ниже, и отображается в раскрывающемся списке метода:

Изображение 1568

  • 0
    что насчет МАРКА? Это показывает, как // ARK: для меня в Xcode 8
  • 0
    Проверьте код, возможно, вы используете некоторые символы Юникода над строкой // MARK :. По какой-то причине xcode запутывается (и потому что отстой) и не может с этим справиться.
Показать ещё 1 комментарий
32

Подтвержденный инженером Apple в лаборатории Swift сегодня утром в WWDC, что в настоящее время в нем нет какой-либо # прагмы или эквивалента, они считают эту ошибку, и она скоро появится, поэтому я предполагаю, что бета 2, Надеюсь.

В любом случае, это на этом пути.


Xcode теперь поддерживает //MARK:,//TODO: и//FIXME ориентиры, чтобы комментировать ваш код и перечисляет их в панели перехода

  • 6
    Бета 2, до сих пор его нет
  • 0
    В xcode beta 3?
Показать ещё 4 комментария
31

Документация

Официальный документ Apple о панели переходов Xcode: добавление аннотаций кода в панель переходов

Предыдущий

Кодекс - Swift 4.2

Изображение 1569

Jump Bar - Xcode 10.0

НОТА

!!!: и ???: похоже, больше не поддерживается, как в Xcode 9.4.1.

Изображение 1570

Панель перехода - Xcode 9.4.1

Изображение 1571

19

Есть три варианта добавления #pragma_mark в Swift:

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

Примечание. Использует - для добавления разделителей

16

Использование

// MARK: SectionName

или

// MARK: - SectionName

Это даст строку над значком прагмы, что сделает ее более читаемой.

Для простоты просто добавьте

// MARK: - <#label#>

к вашим фрагментам кода.

Альтернативный способ -

Используйте его таким образом

private typealias SectionName = ViewController
private extension SectionName  {
    // Your methods
}

Это не только добавит отметку (как и прагма-метку), но и разделит код.

  • 1
    Если вы используете Swiftlint , он будет жаловаться на формат //MARK (без пробела) и предложит // MARK: (text) ( один пробел между // и MARK, без пробела между MARK и : и один пробел между : и название раздела)
  • 2
    @NicolasMiari, спасибо, я отредактировал по твоему предложению. А также попробую использовать SwiftLint для следующего проекта. :)
13
//# MARK: - Spinner Class Methods

Добавьте строку между двоеточием и вашим описанием, чтобы вставить строку разделителя. Это помогает организовать код еще больше. В приведенном выше коде и скриншоте используется комментарий MARK с включенной линией.

  • //# MARK: - Текстовые методы (LINE)
  • //# MARK: текстовые методы (NO LINE)

Это работает только с комментарием MARK.

Изображение 1572

7

Профессиональный программист должен использовать этот тег для хорошего кода. Это также хорошо для командной работы.

// MARK: example Web Service start here
// TODO: example 1
// FIXME: Please change BASE url before live 

Изображение 1573

5

Вы также можете быть заинтересованы в директивах компилятора Swift 4.2/XCode 10, таких как

#warning("Some string to display")

а также

#error("Some error to display")

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

Изображение 1575

  • 0
    Это круто не знал о тех
5

//MARK: не работает для меня в Xcode 6.3.2. Однако это то, что я сделал, чтобы заставить его работать:

1) Код:

import Cocoa

class MainWindowController: NSWindowController {

    //MARK: - My cool methods

    func fly() {
    }

    func turnInvisible() {

    }
}

2) В jump bar ничего не меняется при добавлении комментария //MARK:. Однако, если я нажимаю на самое правое имя в панели перехода, в моем случае он говорит MainWindowController(with a leading C icon), тогда появится всплывающее окно, показывающее эффекты //MARK: comment, а именно заголовок, который гласит: "Мои классные методы",

Изображение 1574

3) Я также замечаю, что если я нажму на один из методов в моем коде, то метод станет самой правой записью в панели перехода. Чтобы получить MainWindowController(with a leading C icon) как самую правую запись в панели перехода, я должен щелкнуть пробел над моими методами.

  • 0
    Разве так не должно быть? Что вы должны нажать на верхнюю панель?
3

Apple заявляет в последней версии Building Cocoa Apps,

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

Символ # по-прежнему остается тем, как вы работаете с различными конфигурациями сборки и т.д., но похоже, что они пытаются сократить вашу потребность в большей части предварительной обработки в духе прагмы и перенаправить вас на другой язык функции вообще. Возможно, это поможет в работе игровых площадок и REPL, как можно ближе к полностью скомпилированному коду.

0

Изображение 1576 Проверьте изображение для более подробной информации, я попытался объяснить все в моем коде.

0

Добавить элемент списка дел: вставить комментарий с префиксом TODO :. Например://TODO: [ваш список дел].

Добавьте напоминание об исправлении ошибки: вставьте комментарий с префиксом FIXME :. Например://FIXME: [ваше напоминание об исправлении ошибки].

Добавить заголовок: Вставить комментарий с префиксом MARK :. Например://MARK: [заголовок вашего раздела].

Добавить разделительную линию. Чтобы добавить разделитель над аннотацией, добавьте дефис (-) перед частью комментария к аннотации. Например://MARK: - [ваш контент]. Чтобы добавить разделитель ниже аннотации, добавьте дефис (-) после части комментария аннотации. Например://MARK: [ваш контент] -.

-1

Вы можете использовать // MARK: и // MARK:- быстро. Второй вариант добавляет разделительную линию.

Сообщество Overcoder
Наверх
Меню