#pragma mark у Swift?


936

У Цілі C я можу використовувати #pragma markдля позначення розділів свого коду в навігаторі символів. Оскільки це команда препроцесора C, вона не доступна в Swift. Чи є в цьому тему "Свіфт", або мені потрібно використовувати некрасиві коментарі?


15
Це дуже важливо для організації нашого довгого коду.
iPatel

Схоже, немає більше швидко помітної різниці між коментарями та відмітками розділів. Розширення не названі, тому окремі файли, здається, є єдиним способом розмежувати два типи коментарів
Stephen J

1
Ви можете перевірити це: stackoverflow.com/a/33040068/1753005
Jayprakash Dubey

1
Для інших новичок Swift та Xcode я лише зазначу, що "навігатор символів", про який говорять усі, - це той, який ви отримуєте, натискаючи на найправішу річ у "стрибковій панелі" у верхній частині вікна редагування. Це не навігатор символів на панелі ліворуч.
RenniePet

1
@HarshilKotecha Swift - мова програмування, незалежна від платформи, на якій вона працює. Марка Pragma є частиною Swift і може використовуватися на Linux, macOS та інших платформах Apple, включаючи iOS. Було б смішно позначати це питання будь-якою з цих платформ, оскільки позначка прагми є особливістю самого Swift, а не платформи. iOS - лише одна з багатьох платформ, де працює Swift. Це важливо для розуміння. Це питання не стосується iOS, а також не про Linux чи macOS. Йдеться про Свіфта.
Ерік Айя

Відповіді:


1202

Можна використовувати // MARK:


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


64
І так, нова угода щодо розробників дозволяє нам поговорити про цей матеріал :)
Frank Schmitt

4
Ви не можете використовувати розширення для зберігання протоколу, який має метод init, такий як NSCoding. Це важко відокремити, якщо ви не можете використовувати його у всіх випадках.
Меттью Ноппен

149
Щодо бета-версії 4, Xcode 6 розпізнає // MARK:, // TODO:а // FIXMEу джерелі Swift і перелічує їх у стрибковій панелі. (До речі, це вже було в (Obj) C джерелі - #pragma markце не єдиний спосіб.) І так, ви все одно можете додати -до свого, MARKщоб розмістити роздільники в меню.
рикстер

17
+1 - рекомендувати розширення. Навіть MARKпрацюючи зараз, використання розширень для групування деяких видів семантично пов'язаного коду (особливо реалізацій протоколу) все ще може бути корисним. IMHO це читає набагато краще, щоб ваша декларація про відповідність протоколу була поруч із методами, які її реалізують, а не 5 декларацій протоколу у верхній частині файлу та 50 відповідних реалізацій методів, випадковим чином розкиданих десь внизу.
рикстер

37
@StevenKramer: Так само, як і з #pragma mark. // MARK: -це просто роздільник, // MARK: - stuffдає вам роздільник і заголовок, а також // MARK: - stuff -дає роздільник, заголовок та інший роздільник у одному рядку коментарів.
рикстер

174

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

Від Xcode 6 ви повинні користуватися // MARK:

Ці функції препроцесора дозволяють наблизити деяку структуру до випадаючого меню редактора вихідного коду.

кілька прикладів:

// MARK:

-> передуватиме горизонтальний роздільник

// MARK: your text goes here

-> ставить «ваш текст сюди» жирним шрифтом у спадному списку

// MARK: - your text goes here

-> ставить «ваш текст йде сюди» жирним шрифтом у спадному списку, перед яким горизонтальний роздільник

оновлення: додано скріншот, тому що деякі люди все ще мають проблеми з цим:

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


1
У XCode 6.1.1 немає роздільників, які використовують // MARK: - textдля мене, і в розкритому списку відображається MARK: текст замість просто тексту .
mostruash

добре працює для мене в Xcode 6.1.1, я щойно додав скріншот - будь ласка, уточнюйте свій код?
Ронні Веберс

Я забув згадати, що спробував це для файлів Objective-C. Хоча голосуючи за зусилля, дякую.
mostruash

1
Я бачу, зараз зрозуміло :-) Початкове запитання про Свіфта, тому я не думав про це. Для повноти: в Objective-C ви можете зробити те ж саме, використовуючи: #pragma mark - Ваш текст маркера йде тут , або просто #pragma mark - якщо вам потрібна смужка, або #pragma mark Ваш текст маркера йде сюди, щоб отримати той самий без бару. (Вибачте, я не можу отримати правильну розмітку для фрагментів коду, я поставив їх жирним шрифтом)
Ronny Webers

Він трохи змінився в Xcode 8.1, але це правило, як правило, працює, віддайте перевагу цій відповіді якнайкраще: D
вітром

167

Для тих, хто зацікавлений у використанні розширень проти прагматичних знаків (як уже згадувалося в першому коментарі), ось як реалізувати це від 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
    }

}

Це також не обов'язково найкраща практика, але це так, як ви це робите, якщо хочете.


6
Це дуже круто, але було б непогано, якби розширення могли мати назви.
Метью Кніппен

16
@Matthew - ти можеш використовувати typealias. Наприклад typealias DataSource = SwiftTableViewController. Потімextension Datasource {}
Логан

1
@PhongLe UITableViewController- це не протокол, це клас. Ви, мабуть, маєте на увазі UITableViewControllerDataSource, але це не той шаблон, який використовується в прикладі.
КПМ

4
Мені просто цікаво, чому не extensionотримали заголовок з протоколом, наприклад extension SwiftTableViewController : UITableViewController, було б читабельніше зрозуміти, чому ви додали це розширення до класу.
holex

7
Зауважте, що якщо ваше розширення існує виключно для виконання протоколу, ви можете назвати розширення: extension SwiftTableViewController : UITableViewDelegate { .. }таextension SwiftTableViewController : UITableViewDatasource { .. }
Craig Otis

117

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

У Swift ви можете досягти цього за допомогоюMARK, TODO OR FIXME

i. ОЗНАКА: //MARK: viewDidLoad

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

Знімок екрана 1

ii. ЗРОБИТИ : //TODO: - viewDidLoad

Ця група буде функціонувати під TODO: - категорія viewDidLoad (показана на знімку 2)

Знімок екрана 2

iii. ВИПРАВИТИ МЕНЕ : //FIXME - viewDidLoad

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

Знімок екрана 3

Перегляньте цю документацію щодо яблук на деталі.


Зауважте, що "-" після TODO та FIXME нічого не роблять. "-" стосується лише директиви MARK.
rismay

1
Він також створює велику з великої літери заголовка розділу в коді "minimap", який можна відображати в правій частині вихідного файлу. Досить зручно.
Оскар

65

Офіційна документація

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

Скріншоти панелі стрибків для зразкового коду

Зразок коду

Поведінка в Xcode 10.1 та macOS 10.14.3 (Mojave)

Xcode 10.1 і macOS 10.14.3

Поведінка в Xcode 10.0 та macOS 10.13.4 (High Sierra)

Xcode 10.0 і macOS 10.13.4

Поведінка в Xcode 9.4.1 та macOS 10.13.0

Xcode 9.4.1 та macOS 10.13.0

Обговорення

!!!:а ???:іноді неможливо відобразити.


!!!: і ???: синтаксис не працює на Xcode 11.3.1
Jayprakash Dubey

56

У коді Objective-C Xcode виявляє коментарі на зразок, // MARK: - fooякий трохи більш портативний, ніж #pragma. Але вони теж не здаються (все-таки?).

Редагувати: виправлено в Xcode 6 beta 4.


6
Я впевнений, що незабаром вони стануть доступними, тому що мені подобається тримати все впорядковано з позначками прагми>. <
Arbitur

1
Я можу підтвердити, що // MARK: -наразі це не працює.
Rui Peres

Не працює, але зразок коду вписаний таким стилем коментарів, тому його слід вибирати з часом.
Нейт Кук

1
чи важливо, що коментар повинен бути портативним? адже перенос коду Swift на будь-яку іншу мову безпосередньо є вже проблемою для розробників.
holex

Гммм, я бачу, що багато людей коментують, що це працює, але я на Beta 6 і // MARK:, здається, не працює. Я намагався з & без місця, з двокрапкою та без, з усією кришкою та змішаною (Марк). Чи є хитрість? Чи потрібно активувати попередній запис чи щось таке?
Олі

37

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

6
Я думаю, що його потенціал набагато більший, ніж прагми, але в цей час прагми все-таки кращі, оскільки розширення не відображає імена протоколів або користувацьких імен у випадаючому меню, як це роблять прагми ( див. Нижче відповідь Whasssaaahhh )
nacho4d

Новий "// MARK:" код корисний, але мені також подобається ваш чіткий приклад використання розширень - особливо для делегатних функцій!
ElmerCat

розширення також обмежують те, що ви можете робити - наприклад, немає збережених властивостей
Confused Vorlon

1
Я використовую обидва, тому що extensionпоодинці насправді не виділяється у спадному меню керування сухарями Xcode.
Nicolas Miari

36

Тепер Xcode 8 обробляє його так, як показано нижче, і відображається так у спадному методі:

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


що з MARK:? Це схоже // ARK: на мене в Xcode 8
fnc12

Перевірте свій код, можливо, ви використовуєте деякі символи unicode над рядком // MARK:. Чомусь xcode плутається (і тому, що смокче), і не може з цим впоратися.
carlos_ms

3
!!!І ???синтаксис як видається , не працюватиме на Xcode 8.3.3 ...
Chris Фредерік

@ChrisFrederick Навіть !!! і ??? здається, не працює над Xocde 11.3.1
Jayprakash Dubey

34

Сьогодні вранці в лабораторії Swift в WWDC, підтверджений інженером Apple, інженер Apple, що зараз немає жодної #прагми або еквівалента, вони вважають це помилкою, і він незабаром з’явиться, тому я думаю, що бета-2 я сподіваюся.

У всякому разі, це на шляху.


Тепер Xcode підтримує // MARK :, // TODO: і // FIXME орієнтири для анотування коду та перерахування їх на панелі стрибків


6
У бета-версії 2 її ще немає
cescofry

Дивно. Працює для мене просто чудово. PS: оновіть свій Xcode.
Даніель

@Daniel: Яка версія Xcode? Я використовую Xcode 6.4 і, здається, не працює на ньому.
Джайпракаш Дюбі

19

У #pragma_markSwift можна додати три варіанти :

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

Примітка: Використовується -для додавання роздільників


17

Використовуйте

// MARK: SectionName

або

// MARK: - SectionName

Це дасть лінію вище позначки прагми, зробивши її більш зрозумілою.

Для зручності просто додайте

// MARK: - <#label#>

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

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

Використовуйте його таким чином

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

Це не тільки додасть позначку (як і прагма-позначка), але й добре відокремить код.


1
Якщо ви користуєтесь Swiftlint , він поскаржиться на //MARKформат (немає пробілу) та запропонує // MARK: (text)( один пробіл між //і MARK, немає пробілу між MARKі :та один пробіл між :і назвою розділу)
Nicolas Miari

2
@NicolasMiari, Дякую, я редагував згідно вашої пропозиції. А також спробуємо використовувати SwiftLint для наступного проекту. :)
Nikhil Manapure

13
//# MARK: - Spinner Class Methods

Додайте рядок між двокрапкою та описом, щоб вставити розділову лінію. Це допомагає ще більше впорядкувати свій код. У коді та скріншоті вище використовується коментар MARK із доданим рядком.

  1. // # МАРКА: - текстові методи (LINE)
  2. // # МАРКА: Текстові методи (НЕ РЕЙНІ)

Це працює лише з коментарем MARK.

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


12

Можливо, вас також зацікавлять такі директиви компілятора Swift 4.2 / XCode 10

#warning("Some string to display")

і

#error("Some error to display")

Це може бути корисно, коли ви дійсно не хочете щось пропустити.

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


Класно. Я попередитиму інших товаришів по команді, коли порушуватимуть хлопця-скаути.
Саззад Хассейн Хан

9

Професійний програміст повинен використовувати цей тег для хорошого коду. Це також добре для роботи в команді.

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

Легко знайти такий спосіб

Легко знайти такий спосіб


6

У Xcode 11 вони додали мінімапу, яку можна активувати Editor -> Minimap.

Мінімапа покаже кожен текст позначки для швидкої орієнтації в коді. Кожна позначка пишеться як би// MARK: Variables

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


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, а саме заголовок із написом "Мої круті методи":

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

3) Я також зауважую, що якщо натиснути один із методів у своєму коді, метод стане найправішим записом у панелі стрибків. Для того, щоб MainWindowController(with a leading C icon)стати найправішим записом у стрибковій панелі, я повинен натиснути пробіл вище своїх методів.


Хіба це не має бути? Що вам потрібно натиснути верхню панель?
Арбітур

3

Apple заявляє в останній версії Build Cocoa Apps ,

Компілятор Swift не включає препроцесора. Натомість для отримання тієї ж функціональності використовується переваги атрибутів часу компіляції, побудови конфігурацій та мовних функцій. З цієї причини директиви препроцесора не імпортуються в Swift.

Здається, що символ # як і раніше працює з різними конфігураціями побудови та подібними речами, але, схоже, вони намагаються обмежити вашу потребу в більшості попередньої обробки в жилах прагми і передати вас взагалі до інших мовних особливостей. Можливо, це допоможе в роботі ігрових майданчиків і REPL поводиться максимально наближеним до повністю складеного коду.


0

Додати елемент завдання: Вставте коментар із префіксом TODO :. Наприклад: // TODO: [ваш предмет завдання].

Додати нагадування про виправлення помилок: Вставте коментар із префіксом FIXME :. Наприклад: // FIXME: [нагадування про виправлення помилок].

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

Додати рядок розділення: Щоб додати роздільник над приміткою, додайте дефіс (-) перед частиною коментаря до примітки. Наприклад: // МАРКА: - [ваш вміст]. Щоб додати роздільник під приміткою, додайте дефіс (-) після частини коментаря до примітки. Наприклад: // МАРКА: [ваш вміст] -.



0

Прагматичний знак - це спосіб поліпшити читабельність вашого коду. Зауваження до прагми з’являться як теги на панелі стрибків Xcode.

//MARK:  <Your comment goes here>

Приклад: у коді

//MARK: Properties

// MARK: View Life cycle

//MARK: Helper methods

Ось як це виглядатиме на панелі стрибків Xcode.

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


Вам просто потрібно вставити їх у потрібні місця у вашому файлі.
varunrathi28
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.