在ObjectiveC中,我可以使用#pragma mark在符号导航器中标记我的代码部分。由于这是一个C预处理器命令,它在Swift中不可用。Swift中有没有替代它,或者我必须使用丑陋的注释?
#pragma mark
在Objective-C代码中,Xcode检测到像// MARK: - foo这样的注释,它比#pragma更具可移植性。但这些似乎也没有被拾取(还没有?)。
// MARK: - foo
#pragma
编辑:在Xcode 6 beta 4中修复。
苹果在最新版本构建可可应用程序中表示,
Swift编译器不包括预处理器。相反,它需要编译时属性、构建配置和语言功能来完成相同的功能。为了这个原因是,预处理器指令没有在Swift中导入。
#字符看起来仍然是你处理各种构建配置和类似的东西的方式,但看起来他们试图减少你对语用预处理的需求,并将你完全转发到其他语言功能。也许这是为了帮助Playground的操作和REPL的行为尽可能接近完全编译的代码。
您可以使用// MARK:
// 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
使用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: your text goes here
->在下拉列表中以粗体显示“您的文本转到此处”
// MARK: - your text goes here
->将“您的文本转到这里”以粗体显示在下拉列表中,前面有一个水平分隔符
更新:添加了截图,因为有些人似乎仍然对此有问题:
在Xcode 6.3.2中,//MARK:对我来说不起作用。然而,这是我对让它工作所做的:
//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:注释的效果,即一个标题,上面写着“我的酷方法”:
jump bar
//MARK
MainWindowController(with a leading C icon)
3)我还注意到,如果我单击代码中的一个方法,那么该方法将成为跳转栏中最右侧的条目。为了让MainWindowController(with a leading C icon)成为跳转栏中最右侧的条目,我必须单击方法上方的空格。
Pragma mark - [SOME TEXT HERE]在Objective-C将多个函数组合在一起中通过行分隔使用。
Pragma mark - [SOME TEXT HERE]
在Swift中,您可以使用MARK, TODO OR FIXME实现这一点
MARK, TODO OR FIXME
一.马克://MARK: viewDidLoad
//MARK: viewDidLoad
这将创建一个水平线,其函数分组在viewdicLoad下(如屏幕截图1所示)
二.待办事项://TODO: - viewDidLoad
//TODO: - viewDidLoad
这将在待办事项:-viewTitLoad类别下对函数进行分组(如屏幕截图2所示)
三.FIXME://FIXME - viewDidLoad
//FIXME - viewDidLoad
这将在FIXME:-viewTitLoad视频加载方式类别下对函数进行分组(如屏幕截图3所示)
查看此苹果留档了解详情。
//# MARK: - Spinner Class Methods
在冒号和描述之间添加一行以插入分隔符。这有助于更好地组织您的代码。上面的代码和屏幕截图使用了包含一行的MARK注释。
这只适用于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有三个选项:
#pragma_mark
1)// MARK: - your text here -
// MARK: - your text here -
2)// TODO: - your text here -
// TODO: - your text here -
3)// FIXME: - your text here -
// FIXME: - your text here -
注意:使用-添加分隔符
-
苹果关于Xcode Jump Bar的官方文档:向跳转栏和小地图添加代码注释介绍了这三点:
TODO:
FIXME:
MARK:
还有两个(虽然不在文档中):
!!!:
???:
某些Xcode版本(例如v10.0)不支持,但最新版本(v13.3.1)支持。
添加待办事项:插入带有前缀待办事项的注释示例://待办事项:[您的待办事项]。 添加bug修复提醒:插入带有前缀FIXME:的注释示例://FIXME:[您的bug修复提醒]。 添加标题:插入带有前缀MARK:的注释。例如://标记:[您的部分标题]。 添加分隔符行:要在注释上方添加分隔符,请添加注释注释部分之前的连字符(-)。例如://MARK:-[您的内容]。要在注释下方添加分隔符,请添加注释注释部分后的连字符(-)。对于示例://MARK:[您的内容]-.
添加待办事项:插入带有前缀待办事项的注释示例://待办事项:[您的待办事项]。
添加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的小地图。
Editor -> Minimap
小地图将显示每个标记文本以在代码中快速定向。每个标记都写得像// MARK: Variables
// MARK: Variables