Swift中的#pragma mark?

Arb*_*tur 912 swift

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

Fra*_*itt 1170

您可以使用 // MARK:


还有人讨论过,无论如何,自由使用类扩展可能是更好的做法.由于扩展可以实现协议,因此您可以将所有表视图委托方法放在扩展中,并将代码分组到比#pragma mark能够更加语义的级别.

  • 从beta 4开始,Xcode 6识别Swift源中的`// MARK:`,`// TODO:`和`// FIXME`,并在跳转栏中列出它们.(顺便说一句,它已经在(Obj)C源代码中执行了 - "#pragma mark"并不是唯一的方法.)是的,您仍然可以在`MARK`中添加`-`以将分隔符放入菜单中. (145认同)
  • 是的,新的开发者协议让我们谈论这个东西:) (62认同)
  • @StevenKramer:与`#pragma mark`相同.`// MARK:-`只是一个分隔符,`// MARK: - stuff`给你一个分隔符和一个标题,`// MARK: - stuff -`给你一个分隔符,一个标题和另一个分隔符在一个评论行. (34认同)
  • +1用于推荐扩展程序.即使使用`MARK`现在工作,使用扩展来分组某些语义相关的代码(尤其是协议实现)仍然是有用的.恕我直言,如果你的协议一致性声明紧挨着实现它的方法,而不是文件顶部的5个协议声明和随机分散在下面的50个相关方法实现,那么它会更好. (14认同)
  • 您不能使用扩展来保存具有init方法的协议,例如NSCoding.如果你不能在所有情况下使用它,那么很难分开. (4认同)
  • FWIW,Apple关于通过扩展添加协议一致性的文档:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25- ID469 (3认同)

Ron*_*ers 168

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

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

这些预处理器功能允许将一些结构带到源代码编辑器的功能下拉框中.

一些例子 :

// MARK:
Run Code Online (Sandbox Code Playgroud)

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

// MARK: your text goes here
Run Code Online (Sandbox Code Playgroud)

- >在下拉列表中以粗体显示"你的文字在这里"

// MARK: - your text goes here
Run Code Online (Sandbox Code Playgroud)

- >在下拉列表中以粗体显示"你的文字在这里",前面是水平分隔符

更新:添加截图'因为有些人似乎仍然有这个问题:

在此输入图像描述

  • 我明白了,现在很清楚了 :-) 最初的问题是关于 Swift 的,所以我没有想到。为了完整起见:在Objective-C中,你可以使用:**#pragma mark - 你的标记文本在这里**,或者如果你需要一个栏,或者**#pragma mark -**,或者**#pragma标记您的标记文本在这里** 以获得相同的无条。(抱歉,我无法为代码片段设置正确的标记,我将它们加粗) (2认同)

Nat*_*bot 167

对于那些对使用扩展与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
    }

}
Run Code Online (Sandbox Code Playgroud)

它也不一定是最好的做法,但如果你愿意,这就是你如何做到的.

  • @Matthew - 你可以使用`typealias`.例如`typealias DataSource = SwiftTableViewController`.然后`扩展Datasource {}` (15认同)
  • 这非常酷,但如果扩展可以有名称会很好. (6认同)
  • 请注意,如果您的扩展仅用作协议实现,您可以*命名扩展名:`extension SwiftTableViewController:UITableViewDelegate {..}`和`extension SwiftTableViewController:UITableViewDatasource {..}` (6认同)
  • 我只是想知道为什么没有`extension`得到了协议的头文件,比如`扩展名SwiftTableViewController:UITableViewController`,你会更加可读,看看你为什么要把这个扩展添加到类中. (4认同)

Jay*_*bey 114

Pragma mark - [SOME TEXT HERE]Objective-C中使用了通过线分离将几个功能组合在一起.

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

一世.MARK: //MARK: viewDidLoad

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

截图1

II.去做 : //TODO: - viewDidLoad

这将在TODO下分组功能: - viewDidLoad类别(如屏幕截图2所示)

截图2

III.整我 : //FIXME - viewDidLoad

这将在FIXME下分组功能: - viewDidLoad类别(如屏幕截图3所示)

截图3


Nik*_*uhe 56

在Objective-C代码中,Xcode检测的评论// MARK: - foo比它更便携#pragma.但这些似乎也没有被提升(但是?).

编辑:已在Xcode 6 beta 4中修复.

  • 我当然希望他们能尽快推出它,因为我喜欢用pragma marks>.< (6认同)

Geo*_*rge 53

官方文件

Apple关于Xcode Jump Bar的官方文档:跳转栏添加代码注释

跳转条样本代码的屏幕截图

示例代码

Xcode 10.1和macOS 10.14.3(Mojave)中的行为

Xcode 10.1和macOS 10.14.3

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

Xcode 10.0和macOS 10.13.4

Xcode 9.4.1和macOS 10.13.0中的行为

Xcode 9.4.1和macOS 10.13.0

讨论

!!!:???:有时不能显示.


jqg*_*imo 36

我认为这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) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

使用后的代码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) {
       ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为它的潜力远远超过pragma,但此时pragma仍然更好,因为扩展不会在下拉菜单中显示协议名称或自定义名称,如pragma所做的那样([见下文Whasssaaahhh的回答](http://stackoverflow.com /一个/十四万九千〇八分之二千六百四十零万八千七百〇六)) (5认同)

Ant*_*ine 36

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

在此输入图像描述

  • 在Xcode 8.3.3上似乎无法使用`!!!`和`???`语法... (2认同)

Dan*_*iel 34

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

无论如何,它就在它的路上.


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

  • Beta 2,还没有它 (6认同)

Jay*_*dip 19

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

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

注意: -用于添加分隔符


Nik*_*ure 17

使用

// MARK: SectionName
Run Code Online (Sandbox Code Playgroud)

要么

// MARK: - SectionName
Run Code Online (Sandbox Code Playgroud)

这将在pragma标记之上给出一行,使其更具可读性.

为了方便添加

// MARK: - <#label#>
Run Code Online (Sandbox Code Playgroud)

到你的代码片段.

替代方式 -

以这种方式使用它

private typealias SectionName = ViewController
private extension SectionName  {
    // Your methods
}
Run Code Online (Sandbox Code Playgroud)

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

  • @NicolasMiari,谢谢,我根据你的建议编辑了.并且还将尝试使用SwiftLint进行下一个项目.:) (2认同)

aas*_*sya 13

//# MARK: - Spinner Class Methods
Run Code Online (Sandbox Code Playgroud)

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

  1. //#MARK: - 文本方法(LINE)
  2. //#MARK:文字方法(NO LINE)

这仅适用于MARK注释.

在此输入图像描述


few*_*ode 10

您可能也对Swift 4.2/XCode 10编译器指令感兴趣

#warning("Some string to display")
Run Code Online (Sandbox Code Playgroud)

#error("Some error to display")
Run Code Online (Sandbox Code Playgroud)

当你真的不想错过任何东西时,它可能会有用.

在此输入图像描述


Har*_*cha 9

专业程序员必须使用此标记才能获得良好的代码.这对团队合作也很有帮助.

// MARK: example Web Service start here
// TODO: example 1
// FIXME: Please change BASE url before live 
Run Code Online (Sandbox Code Playgroud)

很容易找到这样的方法

很容易找到这样的方法


小智 9

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

Minimap 将显示每个标记文本以在代码中快速定位。每个标记都写成// MARK: Variables

在此处输入图片说明


Uto*_*Ltd 5

Apple 在最新版本的Building Cocoa Apps中表示,

Swift 编译器不包含预处理器。相反,它利用编译时属性、构建配置和语言功能来完成相同的功能。因此,预处理器指令不会导入到 Swift 中。

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


7st*_*tud 5

//MARK:在Xcode 6.3.2中似乎不适合我.但是,这就是我为了让它发挥作用而做的事情:

1)代码:

import Cocoa

class MainWindowController: NSWindowController {

    //MARK: - My cool methods

    func fly() {
    }

    func turnInvisible() {

    }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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