#pragma Swift 中的标记?

#pragma mark in Swift?

提问人:Arbitur 提问时间:6/3/2014 最后编辑:rolling_codesArbitur 更新时间:1/23/2023 访问量:252180

问:

在目标 C 中,我可用于在符号导航器中标记代码的各个部分。由于这是一个 C 预处理器命令,因此在 Swift 中不可用。在 Swift 中是否有替身,或者我必须使用丑陋的评论?#pragma mark

SWIFT 文档

评论

25赞 iPatel 6/3/2014
这对于组织我们的长代码非常重要。
2赞 RenniePet 1/21/2017
对于其他 Swift 和 Xcode 新手,我只想提一下,每个人都在谈论的“符号导航器”是当你点击编辑窗口顶部“跳转栏”中最右边的东西时得到的。它不是左侧面板中的符号导航器。
1赞 Harshil Kotecha 1/12/2018
@Moritz iOS 是大多数谷歌搜索关键字,甚至 tvOS 开发人员也搜索 ioS 中的“参数标记”是什么?这个问题问大多数学习 Swift 的新开发人员。所以我认为 iOS 和 Swift 都是这个问题的好关键词。
3赞 Eric Aya 1/12/2018
@HarshilKotecha Swift 是一种独立于其运行平台的编程语言。Pragma 标志是 Swift 的一部分,可以在 Linux、macOS 和其他 Apple 平台(包括 iOS)上使用。用这些平台中的任何一个来标记这个问题都是荒谬的,因为编译指示标记是 Swift 本身的一个功能,而不是平台的一个功能。iOS 只是运行 Swift 的众多平台之一。理解这一点很重要。这个问题与iOS无关,也与Linux或macOS无关。这是关于斯威夫特的。
2赞 Arbitur 1/12/2018
我最初的标签是 iOS 和 Swift,我添加了 iOS,因为这是我通常搜索的标签,并且总是得到很多回应,而且当时 Swift 不是开源的,也没有讨论打开它。

答:

61赞 Nikolai Ruhe 6/3/2014 #1

在 Objective-C 代码中,Xcode 会检测注释,例如 which 比 .但这些似乎也没有被捡起来(还没有?// MARK: - foo#pragma

编辑:在Xcode 6 beta 4中修复。

评论

6赞 Arbitur 6/3/2014
我当然希望他们尽快提供它,因为我喜欢用杂指示标记 >.< 来保持一切井井有条。
1赞 Rui Peres 6/3/2014
我可以确认目前不起作用。// MARK: -
0赞 Nate Cook 6/3/2014
不起作用,但示例代码中充斥着这种风格的注释,因此最终应该将其拾取。
1赞 holex 6/16/2014
评论应该是可移植的,重要吗?因为将 Swift 代码直接移植到任何其他语言对开发人员来说已经是一个挑战。
0赞 Olie 8/24/2014
嗯,我看到很多人评论说它有效,但我在 Beta 6 上,似乎不起作用。我试过有空格和没有空格,有和没有冒号,全大写和混合(马克)。有什么诀窍吗?我需要激活首选项或其他东西吗?// MARK:
5赞 UtopiaLtd 6/3/2014 #2

苹果在最新版本的Building Cocoa Apps中指出,

Swift 编译器不包括预处理器。相反,它需要 编译时属性、构建配置和 语言功能来实现相同的功能。为此 原因,预处理器指令不会导入 Swift。

# 字符似乎仍然是您使用各种构建配置和类似内容的方式,但看起来他们试图减少您对编译指示的大多数预处理的需求,并将您完全转发到其他语言功能。也许这是为了帮助 Playground 的运行,并且 REPL 的行为尽可能接近完全编译的代码。

1290赞 Frank Schmitt 6/4/2014 #3

你可以使用// MARK:


也有人讨论说,无论如何,自由使用类扩展可能是一种更好的做法。由于扩展可以实现协议,因此您可以例如将所有表视图委托方法放在扩展中,并在语义级别上对代码进行分组。#pragma mark

评论

69赞 Frank Schmitt 6/4/2014
是的,新的开发者协议让我们:)谈论这些东西
5赞 Matthew Knippen 6/7/2014
不能使用扩展来保存具有 init 方法的协议,例如 NSCoding。如果您不能在所有情况下使用它,那就很难分开。
160赞 rickster 7/22/2014
从 beta 4 开始,Xcode 6 在 Swift 中识别 和 源代码,并在跳转栏中列出它们。(顺便说一句,它已经在 (Obj)C 源代码中做到了——这不是唯一的方法。是的,您仍然可以添加到菜单中的分隔符。// MARK:// TODO:// FIXME#pragma mark-MARK
17赞 rickster 7/22/2014
+1 推荐扩展。即使现在工作,使用扩展对某些语义相关的代码(尤其是协议实现)进行分组仍然很有用。恕我直言,将您的协议一致性声明放在实现它的方法旁边会读起来要好得多,而不是文件顶部的 5 个协议声明和随机散布在下面某个地方的 50 个相关方法实现。MARK
41赞 rickster 1/15/2015
@StevenKramer:与 相同。 只是一个分隔符,给你一个分隔符和一个标题,并在一个注释行中给你一个分隔符、一个标题和另一个分隔符。#pragma mark// MARK: -// MARK: - stuff// MARK: - stuff -
177赞 NatashaTheRobot 6/6/2014 #4

对于那些对使用扩展与编译指示标记感兴趣的人(如第一条评论中提到的),以下是 Swift 工程师如何实现它:

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赞 Matthew Knippen 6/7/2014
这很酷,但如果扩展可以有名称就好了。
17赞 Logan 6/9/2014
@Matthew - 您可以使用 .例如。然后typealiastypealias DataSource = SwiftTableViewControllerextension Datasource {}
1赞 KPM 6/14/2014
@PhongLe不是一个协议,它是一个类。您的意思是 ,但这不是示例中使用的模式。UITableViewControllerUITableViewControllerDataSource
4赞 holex 6/16/2014
我只是想知道为什么没有获得带有协议的标头,例如,查看为什么将该扩展添加到类中会更具可读性。extensionextension SwiftTableViewController : UITableViewController
7赞 Craig Otis 7/30/2014
请注意,如果扩展仅作为协议实现而存在,则可以将扩展命名为: 和extension SwiftTableViewController : UITableViewDelegate { .. }extension SwiftTableViewController : UITableViewDatasource { .. }
38赞 Daniel 6/7/2014 #5

今天早上在WWDC上与Swift实验室的苹果工程师确认,目前没有任何 #pragma 或等效产品,他们认为这是一个错误,它很快就会到来,所以我猜测beta 2,我希望。

无论如何,它正在路上。


Xcode 现在支持 //MARK:、//TODO: 和 //FIXME 地标来注释你的代码和 在跳转栏中列出它们

评论

6赞 cescofry 6/22/2014
Beta 2,还没有
0赞 Daniel 7/3/2015
奇怪。对我很好。PS:更新你的Xcode。
0赞 Jayprakash Dubey 10/9/2015
@Daniel : 哪个版本的 Xcode?我正在使用 Xcode 6.4,但似乎没有使用它。
41赞 jqgsninimo 6/30/2014 #6

我认为扩展是更好的方法,而不是.#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赞 nacho4d 2/26/2015
我认为它的潜力比编译指示要大得多,但此时编译指示仍然更好,因为扩展不会像编译指示那样在下拉菜单中显示协议名称或自定义名称(见下文 Whasssaaahhh 的回答)
0赞 ElmerCat 11/24/2015
新的 “//MARK:” 代码很有用,但我也很喜欢你关于如何使用扩展的清晰示例——尤其是对于委托函数!
0赞 Confused Vorlon 2/7/2017
扩展还限制了您可以执行的操作 - 例如,没有存储的属性
1赞 Nicolas Miari 10/30/2017
我同时使用两者,因为在 Xcode 的痕迹导航控件的下拉菜单中,单独的 并不能真正脱颖而出。extension
197赞 Ronny Webers 10/16/2014 #7

直到 Xcode 5 之前,预处理器指令都存在。#pragma mark

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

这些预处理器功能允许为源代码编辑器的函数下拉框带来一些结构。

一些例子:

// MARK:

->前面将有一个水平分隔线

// MARK: your text goes here

->下拉列表中以粗体显示“您的文本转到此处”

// MARK: - your text goes here

->下拉列表中以粗体显示“您的文本在这里”,前面是水平分隔符

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

enter image description here

评论

1赞 mostruash 2/21/2015
XCode 6.1.1 中没有分隔符,下拉列表显示 MARK: 文本而不仅仅是文本// MARK: - text
0赞 Ronny Webers 2/23/2015
在 Xcode 6.1.1 中对我来说效果很好,我刚刚添加了一个屏幕截图 - 请检查您的代码?
0赞 mostruash 2/23/2015
我忘了提到我尝试过 Objective-C 文件。不过,请为这项工作投票,谢谢。
2赞 Ronny Webers 2/25/2015
我明白了,现在很清楚了:-)第一个问题问的是 Swift,所以我没有想到这一点。为了完整起见:在 Objective-C 中,你可以使用以下方法做同样的事情:#pragma 标记 - 你的标记文本在这里,或者只是 #pragma 标记 - 如果你需要一个条形,或者 #pragma 标记你的标记文本在这里得到相同的结果,没有条形。 (对不起,我无法为代码片段正确标记,我已经将它们加粗了)
0赞 windsound 11/30/2016
它在 Xcode 8.1 中发生了一些变化,但这条规则通常有效,更喜欢这个答案最好的:D
7赞 7stud 7/3/2015 #8

//MARK:在 Xcode 6.3.2 中似乎对我不起作用。但是,这是我为使其工作所做的:

1)代码:

import Cocoa

class MainWindowController: NSWindowController {

    //MARK: - My cool methods

    func fly() {
    }

    func turnInvisible() {

    }
}

2)在添加:注释时似乎没有任何变化。但是,如果我单击跳转栏中最右边的名称,在我的情况下,它说 ,然后将显示一个弹出窗口,显示 //MARK: 注释的效果,即一个标题,上面写着“我的很酷的方法”:jump bar//MARKMainWindowController(with a leading C icon)

enter image description here

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

评论

0赞 Arbitur 7/3/2015
这不就是应该的吗?你必须点击顶部栏吗?
146赞 Jayprakash Dubey 10/9/2015 #9

Pragma mark - [SOME TEXT HERE]在 Objective-C 中用于通过行分隔将多个函数组合在一起

Swift 中,你可以使用MARK, TODO OR FIXME

i. 标记: //MARK: viewDidLoad

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

Screenshot 1

ii. 待办事项: //TODO: - viewDidLoad

这会将函数分组到 TODO 下: - viewDidLoad 类别(如屏幕截图 2 所示)

Screenshot 2

iii. 修复: //FIXME - viewDidLoad

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

Screenshot 3

有关详细信息,请查看此 Apple 文档

评论

0赞 rismay 2/3/2016
请注意,TODO 和 FIXME 后面的“-”不执行任何操作。“-”仅与 MARK 指令相关。
1赞 Oscar 5/16/2020
它还会在代码“minimap”中创建一个大写的大写部分标题,您可以将其显示在源文件的右侧。相当方便。
17赞 aashish tamsya 2/29/2016 #10
//# MARK: - Spinner Class Methods

在冒号和说明之间添加一行以插入分隔线。这有助于进一步组织您的代码。上面的代码和屏幕截图使用了包含一行的 MARK 注释。

  1. # MARK: – 文本方法 (LINE)
  2. # MARK: 文本方法(无行)

这仅适用于 MARK 注释。

enter image description here

40赞 Antoine 6/17/2016 #11

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

enter image description here

评论

0赞 fnc12 9/15/2016
马克呢:?它在 Xcode 8 中显示为我// ARK:
0赞 carlos_ms 1/6/2017
检查你的代码,你可能在 //MARK: 行上方使用了一些 unicode 字符。出于某种原因,xcode 会感到困惑(而且因为很糟糕),并且无法处理它。
3赞 Chris Frederick 6/12/2017
and 语法似乎不适用于 Xcode 8.3.3...!!!???
1赞 Jayprakash Dubey 5/17/2020
@ChrisFrederick甚至!!和???dosen似乎没有在Xocde 11.3.1上工作
0赞 Chris Frederick 1/14/2021
@JayprakashDubey 它们似乎也无法在 Xcode 12 中工作......
19赞 Nikhil Manapure 11/21/2016 #12

// MARK: SectionName

// MARK: - SectionName

这将在编译指示标记上方给出一行,使其更具可读性。

为方便起见,只需添加

// MARK: - <#label#>

添加到您的代码片段中。

替代方式 -

以这种方式使用它

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

这不仅会添加标记(就像编译指示标记一样),还可以很好地隔离代码。

评论

1赞 Nicolas Miari 10/30/2017
如果您使用 Swiftlint,它会抱怨格式(没有空格)并建议(和 MARK 之间有一个空格,和之间没有空格,和和部分名称之间有一个空格//MARK// MARK: (text)//MARK::
2赞 Nikhil Manapure 10/30/2017
@NicolasMiari,谢谢,我已经根据您的建议进行了编辑。并且还将尝试在下一个项目中使用 SwiftLint。:)
13赞 Harshil Kotecha 7/6/2017 #13

专业程序员必须使用此标签才能获得良好的代码。 它也有利于团队合作。

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

很容易找到这样的方法

It is easy to find method like this

23赞 Berlin 9/30/2017 #14

在 Swift 中可以添加三个选项:#pragma_mark

1)// MARK: - your text here -

2)// TODO: - your text here -

3)// FIXME: - your text here -

注意:用于添加分隔符-

100赞 George 5/3/2018 #15

Xcode 官方文档

Apple 当前的官方文档部分 注释代码以提高可见性 引入了三个注释:、 和 。TODO:FIXME:MARK:

最新的 Xcode 版本 (v14.2) 支持的另外两个注释(尽管没有出现在官方文档中):和 .!!!:???:

注意:并且由于未知原因,某些 Xcode 版本(例如 v10.0)发现不支持。!!!:???:

示例屏幕截图 1 - Xcode 14.2 + macOS 13.1 (Ventura)
示例屏幕截图 2 - Xcode 10.1 + macOS 10.14.3 (Mojave)

code_xcode_10_1 jump_bar_xcode_10_1

评论

0赞 MarkAurelius 5/12/2021
这很酷,但不幸的是,对我来说,使用 Xcode 12.5 ???和!!!注解不执行任何操作。
0赞 George 4/30/2022
@MarkAurelius Xcode v13.3.1 重新添加了对 ??? 的支持和!!!
0赞 Gavin Morrow 1/1/2023
和 注解在 Xcode 14.2 中仍受支持???!!!
2赞 Hiren 9/8/2018 #16

添加待办事项:插入带有前缀 TODO: 的注释。为 example: // 待办事项: [你的待办事项]。

添加错误修复提醒:插入带有前缀 FIXME: 的注释。为 example: // FIXME: [你的错误修复提醒]。

添加标题:插入带有前缀 MARK: 的注释。例如: 马克:[你的章节标题]。

添加分隔线:要在注释上方添加分隔符,请添加 批注的注释部分前的连字符 (-)。例如: 马克: - [你的内容]。要在批注下方添加分隔符,请添加 批注注释部分后面的连字符 (-)。为 example: // MARK: [your content] -.

17赞 fewlinesofcode 10/17/2018 #17

您可能还对 Swift 4.2 / XCode 10 编译器指令感兴趣,例如

#warning("Some string to display")

#error("Some error to display")

当您真的不想错过某些内容时,它可能会很有用。

enter image description here

评论

0赞 Sazzad Hissain Khan 5/21/2019
凉。当违反童子军规则时,我会警告其他队友。
2赞 Nirbhay Singh 4/21/2019 #18

试试这个:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}
3赞 vrat2801 5/23/2019 #19

编译指示标记是一种提高代码可读性的方法。编译指示注释将像 Xcode 跳转栏上的标签一样显示。

//MARK:  <Your comment goes here>

示例:在代码中,

//MARK: Properties

// MARK: View Life cycle

//MARK: Helper methods

这就是它在 Xcode 跳转栏中的显示方式。

enter image description here

评论

0赞 vrat2801 7/22/2019
您只需将它们插入文件中的正确位置即可。
13赞 MarekB 10/7/2019 #20

在 Xcode 11 中,他们添加了可以激活的小地图。Editor -> Minimap

小地图将显示每个标记文本,以便在代码中快速定位。 每个标记都写成这样// MARK: Variables

enter image description here