#在Swift中使用Pragma标记?

在ObjectiveC中,我可以使用#pragma mark在符号导航器中标记我的代码部分。由于这是一个C预处理器命令,它在Swift中不可用。Swift中有没有替代它,或者我必须使用丑陋的注释?

246785 次浏览

在Objective-C代码中,Xcode检测到像// MARK: - foo这样的注释,它比#pragma更具可移植性。但这些似乎也没有被拾取(还没有?)。

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

苹果在最新版本构建可可应用程序中表示,

Swift编译器不包括预处理器。相反,它需要编译时属性、构建配置和语言功能来完成相同的功能。为了这个原因是,预处理器指令没有在Swift中导入。

#字符看起来仍然是你处理各种构建配置和类似的东西的方式,但看起来他们试图减少你对语用预处理的需求,并将你完全转发到其他语言功能。也许这是为了帮助Playground的操作和REPL的行为尽可能接近完全编译的代码。

您可以使用// MARK:


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

对于那些对使用扩展与Pragma标记感兴趣的人(如第一条评论中提到的),以下是如何从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}
}

这也不一定是最好的做法,但如果你喜欢,这就是你的做法。

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

不管怎样,它正在路上。


Xcode现在支持//MARK:,//待办事项:和//FIXME地标来注释你的代码在跳转栏中列出它们

我认为Extensions#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) {...}}

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

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

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

一些例子:

// MARK:

->前面会有一个水平分隔符

// MARK: your text goes here

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

// MARK: - your text goes here

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

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

输入图片描述

在Xcode 6.3.2中,//MARK:对我来说不起作用。然而,这是我对让它工作所做的:

1)代码:

import Cocoa
class MainWindowController: NSWindowController {
//MARK: - My cool methods
func fly() {}
func turnInvisible() {
}}

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

输入图片描述

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

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

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

一.马克://MARK: viewDidLoad

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

截图1

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

这将在待办事项:-viewTitLoad类别下对函数进行分组(如屏幕截图2所示)

截图2

三.FIXME://FIXME - viewDidLoad

这将在FIXME:-viewTitLoad视频加载方式类别下对函数进行分组(如屏幕截图3所示)

Screenshot 3

查看此苹果留档了解详情。

//# MARK: - Spinner Class Methods

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

  1. //#MARK:-文本方法(LINE)
  2. //#标记:文本方法(无行)

这只适用于MARK注释。

在此处输入图像描述

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

在此处输入图像描述

使用

// MARK: SectionName

// MARK: - SectionName

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

为了方便,只需添加

// MARK: - <#label#>

到您的代码片段。

另一种方式-

以这种方式使用它

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

这不仅会添加标记(就像Pragma标记一样),还会很好地隔离代码。

专业程序员必须使用此标签才能编写好代码。这对团队合作也有好处。

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

很容易找到这样的方法

很容易找到这样的方法

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

1)// MARK: - your text here -

2)// TODO: - your text here -

3)// FIXME: - your text here -

注意:使用-添加分隔符

Xcode官方文档

苹果关于Xcode Jump Bar的官方文档:向跳转栏和小地图添加代码注释介绍了这三点:

  • TODO:
  • FIXME:
  • MARK:

还有两个(虽然不在文档中):

  • !!!:
  • ???:

某些Xcode版本(例如v10.0)不支持,但最新版本(v13.3.1)支持。

Xcode示例版本的屏幕截图

示例代码

示例1-Xcode 10.1+macOS 10.14.3(Mojave)

Xcode 10.1 and macOS 10.14.3

示例2-Xcode 10.0+macOS 10.13.4(High Sierra)

Xcode 10.0 and macOS 10.13.4

添加待办事项:插入带有前缀待办事项的注释示例://待办事项:[您的待办事项]。

添加bug修复提醒:插入带有前缀FIXME:的注释示例://FIXME:[您的bug修复提醒]。

添加标题:插入带有前缀MARK:的注释。例如://标记:[您的部分标题]。

添加分隔符行:要在注释上方添加分隔符,请添加注释注释部分之前的连字符(-)。例如://MARK:-[您的内容]。要在注释下方添加分隔符,请添加注释注释部分后的连字符(-)。对于示例://MARK:[您的内容]-.

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

#warning("Some string to display")

#error("Some error to display")

它可能是有用的,当你真的不想错过的东西。

在此处输入图片描述

试试这个:

// MARK: Reload TableView
func reloadTableView(){
tableView.reload()}

Pragma标记是一种提高代码易读性的方法。Pragma注释将像Xcode跳栏上的标签一样显示。

//MARK:  <Your comment goes here>

示例:在代码中,

//MARK: Properties
// MARK: View Life cycle
//MARK: Helper methods

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

在此处输入图片描述

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

小地图将显示每个标记文本以在代码中快速定向。每个标记都写得像// MARK: Variables

在此处输入图片描述