首页 文章

Swift中的#pragma mark?

提问于
浏览
834

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

17 回答

  • 25

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

    1) // MARK: - your text here -

    2) // TODO: - your text here -

    3) // FIXME: - your text here -

    注意:使用 - 添加分隔符

  • 155
    //# MARK: - Spinner Class Methods
    

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

    • //#MARK: - 文字方法(LINE)

    • //#MARK:文字方法(NO LINE)

    这仅适用于MARK注释 .

  • 105

    文档

    Apple关于Xcode Jump Bar的官方文档:Add code annotations to the jump bar

    预览

    代码 - Swift 4.2

    Jump Bar - Xcode 10.0

    注意!!!:和???:似乎不再支持Xcode 9.4.1 .

    Jump Bar - Xcode 9.4.1

  • 54

    你可以用 // MARK:


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

  • 159

    使用

    // MARK: SectionName
    

    要么

    // MARK: - SectionName
    

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

    为了方便添加

    // MARK: - <#label#>
    

    到你的代码片段 .

    Alternate way -

    以这种方式使用它

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

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

  • 35

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

    #warning("Some string to display")
    

    #error("Some error to display")
    

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

  • 34

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

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

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

    一些例子 :

    // MARK:
    
    • 前面会有一个水平分隔符

    // MARK: your text goes here
    
    • 在下拉列表中以粗体显示“你的文字在这里”

    // MARK: - your text goes here
    
    • 在下拉列表中以粗体显示“你的文字在这里”,前面是水平分隔符

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

    enter image description here

  • 13

    //MARK: 不适用于Xcode 6.3.2中的 seem . 但是,这就是我对 get it to work 的所作所为:

    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:注释的效果,即 Headers 为"My cool methods":

    enter image description here

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

  • 1046

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

    在Swift中,您可以使用 MARK, TODO OR FIXME 实现此目的

    一世 . MARK: //MARK: viewDidLoad

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

    II . TODO: //TODO: - viewDidLoad

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

    III . FIXME: //FIXME - viewDidLoad

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

  • 7

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

  • 16

    Apple在Building Cocoa Apps的最新版本中声明,

    Swift编译器不包含预处理器 . 相反,它利用编译时属性,构建配置和语言功能来实现相同的功能 . 因此,预处理程序指令不会在Swift中导入 .

    #字符似乎仍然是你如何使用各种构建配置和类似的东西,但看起来他们试图在pragma的脉络中削减你对大多数预处理的需求,并完全转发你的其他语言功能 . 也许这是为了帮助Playgrounds和REPL的操作尽可能接近完全编译的代码 .

  • 31

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

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

  • 2

    我认为Extensions是一种更好的方式,而不是 #pragma mark .

    使用_114262之前的代码:

    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) {
           ...
        }
    }
    
  • 18

    添加待办事项:插入带有前缀TODO:的注释 . 例如:// TODO:[你的待办事项] .

    添加错误修复提醒:插入带前缀的注释整我: . 例如:// FIXME:[您的错误修复提醒] .

    添加 Headers :插入带有前缀MARK:的注释 . 例如:// MARK:[您的部分 Headers ] .

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

  • 3

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

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


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

  • 1

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

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

    在Objective-C代码中,Xcode检测像 // MARK: - foo 这样的注释,它比 #pragma 更容易移植 . 但这些似乎也没有被提起(但是?) .

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

相关问题