# Pragma mark в Swift?

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

16 ответов


можно использовать // MARK:


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


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

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
    }

}

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


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

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

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

примеры :

// MARK:

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

// MARK: your text goes here

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

// MARK: - your text goes here

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

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

enter image description here


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

на Свифт вы можете добиться этого, используя MARK, TODO OR FIXME

i. Марк : //MARK: viewDidLoad

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

Screenshot 1

ii. TODO: //TODO: - viewDidLoad

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

Screenshot 2

раздел III. FIXME: //FIXME - viewDidLoad

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

Screenshot 3


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

Edit: исправлено в Xcode 6 beta 4.


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

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

enter image description here


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

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


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


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

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

превью

Код-Swift 4.2

Preview in code

Перейти Бар-Xcode 10.0

Примечание

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

Preview in Xcode 10.0 Jump Bar

Перейти Бар-Xcode 9.4.1

Preview in Xcode 9.4.1 Jump Bar


есть три варианта, чтобы добавить #pragma_mark в Swift:

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

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


использовать

// MARK: SectionName

или

// MARK: - SectionName

это даст строку выше отметки pragma, что сделает ее более читаемой.

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

// MARK: - <#label#>

фрагменты кода.

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

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

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

это не только добавит метку (так же, как Pragma mark), но и красиво отделит код.


//# MARK: - Spinner Class Methods

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

  1. / / # MARK: - текстовые методы (строка)
  2. / / # MARK: текстовые методы (без строки)

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

enter image description here


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

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

It is easy to find method like this


//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) чтобы быть самой правой записью в панели перехода, я должен нажать на пробелы над моими методами.


Apple заявляет в последней версии Создание Приложений Какао,

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

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


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

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

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

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