Swift中的#pragma mark?

#pragma mark in Swift?

在目标C中,我可以使用#pragma mark在符号导航器中标记代码的部分。因为这是一个C预处理器命令,所以它在swift中不可用。有没有一个立场在这迅速,还是我必须使用丑陋的评论?


您可以使用// MARK:

也有人讨论过自由使用类扩展可能是更好的实践。因为扩展可以实现协议,所以您可以将所有表视图委托方法放在一个扩展中,并将代码分组到比#pragma mark所能实现的语义级别更高的级别。


对于那些对使用扩展和pragma标记感兴趣的人(如第一条注释中所述),下面是如何从swift工程师那里实现它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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

从Xcode6开始,您必须使用// MARK:

这些预处理器特性允许将一些结构带到源代码编辑器的函数下拉框中。

一些例子:

1
// MARK:

->前面是一个水平分隔符

1
// MARK: your text goes here

->在下拉列表中用粗体显示"此处显示您的文本"

1
// MARK: - your text goes here

->在下拉列表中以粗体显示"此处显示您的文本",前面是水平分隔符

更新:添加了屏幕截图,因为有些人似乎仍然对此有问题:

enter image description here


在Objective-C中使用Pragma mark - [SOME TEXT HERE]对多个功能进行了分行分组。

在Swift中,您可以使用MARK, TODO OR FIXME来实现这一点。

一、标记://MARK: viewDidLoad

这将创建一条水平线,函数分组在viewdidload下(如屏幕截图1所示)。

Screenshot 1

二。TODO://TODO: - viewDidLoad

这将在todo:-viewdidload类别下对函数进行分组(如屏幕截图2所示)

Screenshot 2

三、固定件://FIXME - viewDidLoad

这将在fixme下对函数进行分组:-viewdidload类别(如屏幕截图3所示)

Screenshot 3


在objective-c代码中,xcode检测像// MARK: - foo这样的注释,这比#pragma更易于移植。但这些似乎也没有被收集起来(还没有?).

编辑:在Xcode6测试版4中修复。


官方文件

苹果关于xcode跳转条的官方文件:添加代码注释到跳转条

示例代码的跳转条截图

Sample Code

Xcode 10.1和MacOS 10.14.3中的行为(mojave)

Xcode 10.1 and macOS 10.14.3

Xcode 10.0和MacOS 10.13.4(High Sierra)中的行为

Xcode 10.0 and macOS 10.13.4

Xcode 9.4.1和MacOS 10.13.0中的行为

Xcode 9.4.1 and macOS 10.13.0

讨论

!!!:???:有时无法显示。


Xcode8现在按如下方式处理它,并在方法下拉列表中显示如下:

enter image description here


我认为用Extensions代替#pragma mark是更好的方法。

使用Extensions前的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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) {
       ...
    }
}


今天早上在WWDC的Swift实验室与一位苹果工程师确认,目前还没有任何杂注或等效物,他们认为这是一个bug,很快就会出现,所以我想应该是beta 2。

不管怎样,一切都在进行中。

Xcode现在支持//mark:,//todo:和//fixme标志来注释代码和在跳转栏中列出它们


在swift中增加#pragma_mark有三种选择:

1)江户十一〔1〕号

2)江户十一〔2〕

3)江户十一〔3〕。

注:添加分隔符时使用-


使用

1
// MARK: SectionName

1
// MARK: - SectionName

这将在pragma mark上面给出一行,使其更具可读性。

为方便起见,只需添加

1
// MARK: - <#label#>

到您的代码段。

替代方式-

用这种方法

1
2
3
4
private typealias SectionName = ViewController
private extension SectionName  {
    // Your methods
}

这不仅可以添加标记(就像pragma标记一样),而且可以很好地隔离代码。


1
//# MARK: - Spinner Class Methods

在冒号和说明之间添加一行以插入分隔符行。这有助于更好地组织代码。上面的代码和屏幕截图使用了包含行的标记注释。

  • //#标记:–文本方法(行)
  • //#标记:文本方法(无行)
  • 这只适用于标记注释。

    enter image description here


    专业编程人员必须使用这个标签来获得良好的代码。这也有利于团队合作。

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

    很容易找到这样的方法

    It is easy to find method like this


    您也可能对swift 4.2/xcode 10编译器指令感兴趣,例如

    1
    #warning("Some string to display")

    1
    #error("Some error to display")

    当你真的不想错过什么东西的时候,它可能会很有用。

    enter image description here


    在Xcode6.3.2中,//MARK:似乎不适合我。但是,这是我为使它工作所做的:

    1)代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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的效果,即显示"我的酷方法"的标题:

    enter image description here

    3)我还注意到,如果我单击代码中的某个方法,那么该方法将成为跳转栏中最右边的条目。为了让MainWindowController(with a leading C icon)成为跳转条中最右边的条目,我必须单击方法上方的空白。


    苹果在最新版本的Cocoa应用程序中声明,

    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.

    角色似乎仍然是您处理各种构建配置和类似的事情的方式,但看起来他们试图减少您对大多数预处理的需求,以语用的方式,并将您完全转发到其他语言功能。也许这是为了帮助操场的运作和repl尽可能接近完全编译的代码。


    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] -.


    试试这个:

    //标记:重新加载TableView

    func reloadTableView()。{

    1
    tableView.reload()

    }