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?
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.
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 :
https://i.stack.imgur.com/w27aK.png
// MARK: - text
for me and drop down list shows MARK: text instead of just text.
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.
typealias
. For example typealias DataSource = SwiftTableViewController
. Then extension Datasource {}
UITableViewController
is not a protocol, it is a class. You probably mean UITableViewControllerDataSource
, but this is not the pattern used in the example.
extension
got the header with the protocol, like extension SwiftTableViewController : UITableViewController
, it would be more readable to see why you added that extension to the class.
extension SwiftTableViewController : UITableViewDelegate { .. }
and extension SwiftTableViewController : UITableViewDatasource { .. }
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)
https://i.stack.imgur.com/etMuG.png
ii. TODO : //TODO: - viewDidLoad
This will group function under TODO: - viewDidLoad category (shown in screenshot 2)
https://i.stack.imgur.com/ltmSl.png
iii. FIXME : //FIXME - viewDidLoad
This will group function under FIXME: - viewDidLoad category (shown in screenshot 3)
https://i.stack.imgur.com/1oLFC.png
Check this apple documentation for details.
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
Example 1 - Xcode 10.1 + macOS 10.14.3 (Mojave)
Example 2 - Xcode 10.0 + macOS 10.13.4 (High Sierra)
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.
// MARK: -
is not working for the moment.
// MARK:
doesn't seem to be working. I've tried with & without the space, with and without the colon, all-caps and mixed (Mark). Is there a trick? Do I need to activate a pref or something?
Xcode 8 now handles it as followed and shows up like this in the method dropdown:
https://i.stack.imgur.com/nnCOM.jpg
// ARK:
for me in Xcode 8
!!!
and ???
syntax doesn't appear to be working on Xcode 8.3.3...
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) {
...
}
}
extension
alone does not really stand out in the dropdown menu of Xcode's breadcrumb control.
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
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
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.
//MARK
format (no space) and suggest // MARK: (text)
(one space between //
and MARK, no space between MARK
and :
, and one space between :
and the section name)
//# 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.
//# MARK: – Text Methods (LINE) //# MARK: Text Methods (NO LINE)
This only works with the MARK comment.
https://i.stack.imgur.com/k6qsi.png
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.
https://i.stack.imgur.com/slGSf.png
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
https://i.stack.imgur.com/mCsQY.png
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
https://i.stack.imgur.com/X2Wyk.png
//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":
https://i.stack.imgur.com/os9sk.jpg
3) 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.
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.
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.
https://i.stack.imgur.com/5rcSv.png
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] -.
Try this:
// MARK: Reload TableView
func reloadTableView(){
tableView.reload()
}
Success story sharing
// MARK:
,// TODO:
and// FIXME
in Swift source and lists them in the jump bar. (BTW, it already did in (Obj)C source --#pragma mark
isn't the only way.) And yes, you can still add-
to yourMARK
to put separators in the menu.MARK
working now, using extensions to group some kinds of semantically related code (especially protocol implementations) can still be useful. IMHO it reads a lot better to have your declaration of protocol conformance right next to the methods that implement it, not 5 protocol declarations at the top of the file and 50 related method implementations randomly scattered somewhere below.#pragma mark
.// MARK: -
is just a separator,// MARK: - stuff
gives you a separator and a header, and// MARK: - stuff -
gives you a separator, a header, and another separator all in one comment line.