# прагма в Swift?

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

Ответы

Ответ 1

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


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

Ответ 2

Для тех, кто заинтересован в использовании расширений 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
    }

}

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

Ответ 3

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

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

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

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

// MARK:

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

// MARK: your text goes here

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

// MARK: - your text goes here

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

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

enter image description here

Ответ 4

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

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

я. MARK: //MARK: viewDidLoad

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

Снимок экрана 1

II. TODO: //TODO: - viewDidLoad

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

Скриншот 2

III. FIXME: //FIXME - viewDidLoad

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

Снимок экрана 3

Ответ 5

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

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

Ответ 6

Официальная документация

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

Скриншоты Jump Bar для примера кода

Sample Code

Поведение в Xcode 10.1 и macOS 10.14.3 (Мохаве)

Xcode 10.1 and macOS 10.14.3

Поведение в Xcode 10.0 и macOS 10.13.4 (High Sierra)

Xcode 10.0 and macOS 10.13.4

Поведение в Xcode 9.4.1 и macOS 10.13.0

Xcode 9.4.1 and macOS 10.13.0

обсуждение

!!!: и ???: иногда не могут отображаться.

Ответ 7

Я думаю, 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) {
       ...
    }
}

Ответ 8

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

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

Ответ 9

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

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


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

Ответ 10

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

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

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

Ответ 11

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

// MARK: SectionName

или

// MARK: - SectionName

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

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

// MARK: - <#label#>

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

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

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

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

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

Ответ 12

//# MARK: - Spinner Class Methods

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

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

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

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

Ответ 13

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

#warning("Some string to display")

а также

#error("Some error to display")

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

enter image description here

Ответ 14

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

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

Подобный метод легко найти

It is easy to find method like this

Ответ 15

//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, а именно заголовок, который гласит: "Мои классные методы",

enter image description here

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

Ответ 16

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

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

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

Ответ 17

В Xcode 11 они добавили миникарту, которую можно активировать Editor -> Minimap.

Мини-карта покажет каждый текст пометки для быстрой ориентации в коде. Каждый знак написан как // MARK: Variables

enter image description here

Ответ 18

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

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

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

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

Ответ 19

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

Ответ 20

Попробуй это:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}

Ответ 21

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

Ответ 22

Прагма - это способ улучшить читабельность вашего кода. Комментарии прагмы выглядят как теги на панели переходов Xcode.

//MARK:  <Your comment goes here>

Пример: в коде

//MARK: Properties

// MARK: View Life cycle

//MARK: Helper methods

Вот как это будет выглядеть в панели переходов Xcode.

enter image description here