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


当前回答

我认为Extensions是一个更好的方式而不是#pragma mark。

使用扩展前的代码:

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

使用扩展后的代码:

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 8现在像下面这样处理它,在方法下拉菜单中显示如下:

Xcode官方文档

苹果目前的官方文档部分为可见性注释代码引入了三个注释: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)

你可以使用// MARK:


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

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

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

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

试试这个:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}