#pragma mark in Swift?

SwiftDocumentation

Swift Problem Overview


In Objective C, I can use #pragma mark to mark sections of my code in the symbol navigator. Since this is a C preprocessor command, it's not available in Swift. Is there a stand-in for this in Swift, or do I have to use ugly comments?

Swift Solutions


Solution 1 - Swift

You can use // MARK:


There has also been discussion that liberal use of class extensions might be a better practice anyway. Since extensions can implement protocols, you can e.g. put all of your table view delegate methods in an extension and group your code at a more semantic level than #pragma mark is capable of.

Solution 2 - Swift

Up to Xcode 5 the preprocessor directive #pragma mark existed.

From Xcode 6 on, you have to use // MARK:

These preprocessor features allow to bring some structure to the function drop down box of the source code editor.

some examples :

// MARK:

-> will be preceded by a horizontal divider

// MARK: your text goes here

-> puts 'your text goes here' in bold in the drop down list

// MARK: - your text goes here

-> puts 'your text goes here' in bold in the drop down list, preceded by a horizontal divider

update : added screenshot 'cause some people still seem to have issues with this :

enter image description here

Solution 3 - Swift

For those who are interested in using extensions vs pragma marks (as mentioned in the first comment), here is how to implement it from a 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
    }

}

It's also not necessarily the best practice, but this is how you do it if you like.

Solution 4 - Swift

Pragma mark - [SOME TEXT HERE] was used in Objective-C to group several function together by line separating.

In Swift you can achieve this using MARK, TODO OR FIXME

i. MARK : //MARK: viewDidLoad

This will create a horizontal line with functions grouped under viewDidLoad(shown in screenshot 1)

Screenshot 1

ii. TODO : //TODO: - viewDidLoad

This will group function under TODO: - viewDidLoad category (shown in screenshot 2)

Screenshot 2

iii. FIXME : //FIXME - viewDidLoad

This will group function under FIXME: - viewDidLoad category (shown in screenshot 3)

Screenshot 3

Check this apple documentation for details.

Solution 5 - Swift

Xcode Official Doc

Apple's official document about Xcode Jump Bar: Add code annotations to the jump bar and minimap introduces these three:

  • TODO:
  • FIXME:
  • MARK:

There are two more (though not in the doc):

  • !!!:
  • ???:

which are not supported by some Xcode versions (such as v10.0), but are supported by latest version (v13.3.1).

Screenshots for Sample Versions of Xcode

> Sample Code

Example 1 - Xcode 10.1 + macOS 10.14.3 (Mojave)

> Xcode 10.1 and macOS 10.14.3

Example 2 - Xcode 10.0 + macOS 10.13.4 (High Sierra)

> Xcode 10.0 and macOS 10.13.4

Solution 6 - Swift

In Objective-C code Xcode detects comments like // MARK: - foo which is a bit more portable than #pragma. But these do not seem to be picked up, too (yet?).

Edit: Fixed in Xcode 6 beta 4.

Solution 7 - Swift

I think Extensions is a better way instead of #pragma mark.

The Code before using 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) {
        ...
    }
}

The code after using 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) {
       ...
    }
}

Solution 8 - Swift

Xcode 8 now handles it as followed and shows up like this in the method dropdown:

enter image description here

Solution 9 - Swift

Confirmed with an Apple Engineer in the Swift lab this morning at WWDC that there currently aren't any #pragma or equivalent at the moment, they consider this a bug, and it will arrive soon, so I am guessing beta 2, I hope.

Anyway, it's on it's way.


Xcode now supports //MARK:, //TODO: and //FIXME landmarks to annotate your code and lists them in the jump bar

Solution 10 - Swift

There are Three options to add #pragma_mark in Swift:

  1. // MARK: - your text here -

  2. // TODO: - your text here -

  3. // FIXME: - your text here -

Note: Uses - for add separators

Solution 11 - Swift

Use

// MARK: SectionName

or

// MARK: - SectionName

This will give a line above pragma mark, making it more readable.

For ease just add

// MARK: - <#label#>

to your code snippets.

Alternate way -

Use it in this way

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

This will not only add mark(just like pragma mark) but also segregate the code nicely.

Solution 12 - Swift

//# MARK: - Spinner Class Methods

Add a line between the colon and your description to insert a separator line. This helps to organize your code even more. The code and screenshot above make use of the MARK comment with a line included.

  1. //# MARK: – Text Methods (LINE)
  2. //# MARK: Text Methods (NO LINE)

This only works with the MARK comment.

enter image description here

Solution 13 - Swift

You may also be interested in Swift 4.2 / XCode 10 compiler directives like

#warning("Some string to display")

and

#error("Some error to display")

It might be useful when you really don't want to miss something.

enter image description here

Solution 14 - Swift

Professional programer must be use this tag for good code. It is also good for team work.

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

It is easy to find method like this

It is easy to find method like this

Solution 15 - Swift

In Xcode 11 they added minimap which can be activated Editor -> Minimap.

Minimap will show each mark text for fast orientation in code. Each mark is written like // MARK: Variables

enter image description here

Solution 16 - Swift

//MARK: does not seem to work for me in Xcode 6.3.2. However, this is what I did to get it to work:

  1. Code:

    import Cocoa

    class MainWindowController: NSWindowController {

     //MARK: - My cool methods
     
     func fly() {
     }
     
     func turnInvisible() {
         
     }
    

    }

  2. In the jump bar nothing appears to change when adding the //MARK: comment. However, if I click on the rightmost name in the jump bar, in my case it says MainWindowController(with a leading C icon), then a popup window will display showing the effects of the //MARK: comment, namely a heading that says "My cool methods":

enter image description here

  1. I also notice that if I click on one of the methods in my code, then the method becomes the rightmost entry in the jump bar. In order to get MainWindowController(with a leading C icon) to be the rightmost entry in the jump bar, I have to click on the whitespace above my methods.

Solution 17 - Swift

Apple states in the latest version of Building Cocoa Apps,

> The Swift compiler does not include a preprocessor. Instead, it takes > advantage of compile-time attributes, build configurations, and > language features to accomplish the same functionality. For this > reason, preprocessor directives are not imported in Swift.

The # character appears to still be how you work with various build configurations and things like that, but it looks like they're trying to cut back on your need for most preprocessing in the vein of pragma and forward you to other language features altogether. Perhaps this is to aid in the operation of the Playgrounds and the REPL behaving as close as possible to the fully compiled code.

Solution 18 - Swift

Pragma mark is a way to improve the readability of your code. The pragma comments would appear like tags on the Xcode jumpbar.

//MARK:  <Your comment goes here>

Example: In the code,

//MARK: Properties

// MARK: View Life cycle

//MARK: Helper methods

This is how it would appear in the Xcode jump bar.

enter image description here

Solution 19 - Swift

> Add a to-do item: Insert a comment with the prefix TODO:. For > example: // TODO: [your to-do item]. > > Add a bug fix reminder: Insert a comment with the prefix FIXME:. For > example: // FIXME: [your bug fix reminder]. > > Add a heading: Insert a comment with the prefix MARK:. For example: > // MARK: [your section heading]. > > Add a separator line: To add a separator above an annotation, add a > hyphen (-) before the comment portion of the annotation. For example: > // MARK: - [your content]. To add a separator below an annotation, add > a hyphen (-) after the comment portion of the annotation. For > example: // MARK: [your content] -.

Solution 20 - Swift

Try this:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionArbiturView Question on Stackoverflow
Solution 1 - SwiftFrank SchmittView Answer on Stackoverflow
Solution 2 - SwiftRonny WebersView Answer on Stackoverflow
Solution 3 - SwiftNatashaTheRobotView Answer on Stackoverflow
Solution 4 - SwiftJayprakash DubeyView Answer on Stackoverflow
Solution 5 - SwiftGeorgeView Answer on Stackoverflow
Solution 6 - SwiftNikolai RuheView Answer on Stackoverflow
Solution 7 - SwiftjqgsninimoView Answer on Stackoverflow
Solution 8 - SwiftAntoineView Answer on Stackoverflow
Solution 9 - SwiftDanielView Answer on Stackoverflow
Solution 10 - SwiftJaydipView Answer on Stackoverflow
Solution 11 - SwiftNikhil ManapureView Answer on Stackoverflow
Solution 12 - Swiftaashish tamsyaView Answer on Stackoverflow
Solution 13 - SwiftfewlinesofcodeView Answer on Stackoverflow
Solution 14 - SwiftHarshil KotechaView Answer on Stackoverflow
Solution 15 - SwiftMarekBView Answer on Stackoverflow
Solution 16 - Swift7studView Answer on Stackoverflow
Solution 17 - SwiftUtopiaLtdView Answer on Stackoverflow
Solution 18 - Swiftvrat2801View Answer on Stackoverflow
Solution 19 - SwiftHirenView Answer on Stackoverflow
Solution 20 - SwiftNirbhay SinghView Answer on Stackoverflow