# 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 : добавлен скриншот, потому что у некоторых людей все еще есть проблемы с этим:
Pragma mark - [SOME TEXT HERE]
был в цель - C, чтобы сгруппировать несколько функций вместе по линии, разделяющей.
на Свифт вы можете добиться этого, используя MARK, TODO OR FIXME
i. Марк : //MARK: viewDidLoad
Это создаст горизонтальная линия с функциями, сгруппированными под viewDidLoad (показано на скриншоте 1)
ii. TODO: //TODO: - viewDidLoad
этот будет группировать функцию под TODO: - viewDidLoad категория (показано на скриншоте 2)
раздел III. FIXME: //FIXME - viewDidLoad
это будет группировать функцию под FIXME: - viewDidLoad категория (показано на скриншоте 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 теперь обрабатывает его следующим образом и отображается так в раскрывающемся списке метода:
подтверждено инженером Apple в лаборатории Swift сегодня утром в WWDC, что в настоящее время нет никакой #pragma или эквивалента на данный момент, они считают это ошибкой, и она скоро прибудет, поэтому я предполагаю бета-2, я надеюсь.
в любом случае, это на его пути.
Xcode теперь поддерживает //MARK:, //TODO: и / / FIXME ориентиры для аннотирования кода и перечисляет их в панели перехода
документация
официальный документ Apple о Xcode Jump Bar:добавить аннотации кода в панель перехода
превью
Код-Swift 4.2
Перейти Бар-Xcode 10.0
Примечание
!!!:
и???:
кажется, больше не поддерживается, как в Xcode 9.4.1.
Перейти Бар-Xcode 9.4.1
есть три варианта, чтобы добавить #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
добавьте строку между двоеточием и описанием, чтобы вставить разделительную строку. Это помогает еще больше упорядочить код. Код и скриншот выше используют комментарий метки с включенной строкой.
- / / # MARK: - текстовые методы (строка)
- / / # MARK: текстовые методы (без строки)
это работает только с комментарием метки.
профессиональный программист должен использовать этот тег для хорошего кода. Это также хорошо для командной работы.
// MARK: example Web Service start here
// TODO: example 1
// FIXME: Please change BASE url before live
//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, а именно заголовок что говорит "мои классные методы":
3) я также замечаю, что если я нажму на один из методов в моем коде, то метод станет самой правой записью в панели перехода. Чтобы получить MainWindowController(with a leading C icon)
чтобы быть самой правой записью в панели перехода, я должен нажать на пробелы над моими методами.
Apple заявляет в последней версии Создание Приложений Какао,
компилятор Swift не включает препроцессор. Вместо этого, он принимает преимущество атрибутов времени компиляции, конфигураций сборки и языковые функции для выполнения той же функциональности. Для этого причина, директивы препроцессора не импортируются в Swift.
символ # по-прежнему выглядит так, как вы работаете с различными сборками конфигурации и тому подобное, но похоже, что они пытаются сократить вашу потребность в большей части предварительной обработки в духе pragma и перенаправить вас на другие языковые функции в целом. Возможно, это должно помочь в работе игровых площадок и REPL вести себя как можно ближе к полностью скомпилированному коду.
добавить элемент задачи: вставить комментарий с префиксом TODO:. Например: / / TODO: [ваш элемент задач].
добавить напоминание об ошибке: вставьте комментарий с префиксом FIXME:. Например: / / FIXME: [ваше напоминание об ошибке].
добавить заголовок: вставить комментарий с пометкой префикса:. Например: / / MARK: [заголовок раздела].
добавить разделительную строку: чтобы добавить разделитель над аннотацией, добавьте дефис ( - ) перед частью комментария аннотация. Например: / / MARK: - [ваш контент]. Чтобы добавить разделитель под аннотацией, добавьте дефис ( - ) после части комментария аннотации. Например: / / MARK: [ваш контент] -.