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 :
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.
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)
ii. TODO : //TODO: - viewDidLoad
This will group function under TODO: - viewDidLoad category (shown in screenshot 2)
iii. FIXME : //FIXME - viewDidLoad
This will group function under FIXME: - viewDidLoad category (shown in screenshot 3)
Check this apple documentation for details.
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).
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.
Xcode 8 now handles it as followed and shows up like this in the method dropdown:
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) {
...
}
}
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: - 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.
This only works with the MARK comment.
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
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With