在目标C中,我可以使用#pragma mark
符号导航器标记代码的各个部分。由于这是C预处理程序命令,因此在Swift中不可用。在Swift中有替代方法吗?还是我必须使用丑陋的注释?
在目标C中,我可以使用#pragma mark
符号导航器标记代码的各个部分。由于这是C预处理程序命令,因此在Swift中不可用。在Swift中有替代方法吗?还是我必须使用丑陋的注释?
Answers:
您可以使用 // MARK:
也有讨论认为,无论如何,自由使用类扩展可能是更好的做法。由于扩展可以实现协议,因此您可以(例如)将所有表视图委托方法放入扩展中,并以比#pragma mark
其能力更高的语义级别对代码进行分组。
// MARK:
,// TODO:
并// FIXME
在Swift源代码中并将它们列出在跳转栏中。(顺便说一句,它已经在做(的OBJ)C源代码- #pragma mark
是不是唯一的方式。)是的,你仍然可以添加-
到您的MARK
放隔板在菜单中。
MARK
现在工作,使用扩展对某些语义相关的代码(尤其是协议实现)进行分组仍然很有用。恕我直言,将协议一致性声明放在实现该方法的方法旁边,而不是文件顶部的5个协议声明和随机散布在下面的50个相关方法实现上,要好得多。
#pragma mark
。// MARK: -
只是一个分隔符,// MARK: - stuff
为您提供分隔符和标题,并// MARK: - stuff -
在一条注释行中为您提供分隔符,标题和另一个分隔符。
直到Xcode 5,预处理器指令都#pragma mark
存在。
从Xcode 6开始,您必须使用 // MARK:
这些预处理器功能允许在源代码编辑器的功能下拉框中添加一些结构。
一些例子 :
// MARK:
->将在水平分隔符之前
// MARK: your text goes here
->在下拉列表中以粗体显示“您的文字在此处”
// MARK: - your text goes here
->在下拉列表中以粗体显示“您的文本在此处”,并在其前添加水平分隔线
更新:添加了屏幕截图,因为某些人似乎仍然对此有疑问:
// MARK: - text
用于我的分隔符,并且下拉列表显示MARK:文本,而不仅仅是text。
对于那些对使用扩展vs.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
}
}
这也不一定是最佳实践,但是如果您愿意,这就是您的做法。
typealias
。例如typealias DataSource = SwiftTableViewController
。然后extension Datasource {}
UITableViewController
不是协议,它是一个类。您可能是说UITableViewControllerDataSource
,但这不是示例中使用的模式。
extension
带有协议的标头(如)extension SwiftTableViewController : UITableViewController
,因此更容易理解为什么将扩展名添加到类中。
extension SwiftTableViewController : UITableViewDelegate { .. }
和extension SwiftTableViewController : UITableViewDatasource { .. }
Pragma mark - [SOME TEXT HERE]
在Objective-C中用于将行分隔的几个功能组合在一起。
在Swift中,您可以使用MARK, TODO OR FIXME
一世。标记: //MARK: viewDidLoad
这将创建一条水平线,并将功能分组在viewDidLoad下(如屏幕截图1所示)。
ii。去做 : //TODO: - viewDidLoad
这会将功能分组到TODO下:-viewDidLoad类别(如屏幕截图2所示)。
iii。整我 : //FIXME - viewDidLoad
这会将功能分组到FIXME下:-viewDidLoad类别(如屏幕截图3所示)
有关详细信息,请查阅此Apple文档。
苹果公司有关Xcode跳转栏的官方文档:在跳转栏中添加代码注释
!!!:
而???:
有时不能显示。
在Objective-C代码中,Xcode检测到的注释// MARK: - foo
比注释更易于移植#pragma
。但是这些似乎也没有被捡起来(还?)。
编辑:在Xcode 6 beta 4中修复。
// MARK: -
目前无法正常运作。
// MARK:
可行,但是我使用的是Beta 6,但似乎不起作用。我试过在有无空格,有无结肠,全大写字母和混合(马克)的情况下进行尝试。有把戏吗?我需要激活偏好设置吗?
我认为这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) {
...
}
}
extension
Xcode的面包屑控件的下拉菜单中,仅凭这种方法并不能真正脱颖而出。
今天早上在WWDC的Swift实验室中与Apple工程师确认,目前目前没有任何#pragma或同等功能,他们认为这是一个错误,并且即将发布,因此,我希望是beta 2。
无论如何,它正在路上。
Xcode现在支持// MARK :、 // TODO:和// FIXME地标来注释您的代码并在跳转栏中列出它们
采用
// MARK: SectionName
要么
// MARK: - SectionName
这将在实用标记上方显示一行,使其更具可读性。
为简便起见,只需添加
// MARK: - <#label#>
您的代码段。
替代方式-
用这种方式使用
private typealias SectionName = ViewController
private extension SectionName {
// Your methods
}
这不仅会添加标记(就像编译指示一样),而且还会很好地隔离代码。
//MARK
格式(无空格),并建议// MARK: (text)
(一个空间之间//
和MARK,没有空间之间MARK
和:
,和一个空格之间:
和部分名称)
您可能也对Swift 4.2 / XCode 10编译器指令感兴趣,例如
#warning("Some string to display")
和
#error("Some error to display")
当您真的不想错过任何东西时,它可能会很有用。
专业程序员必须使用此标记才能获得良好的代码。这也有利于团队合作。
// MARK: example Web Service start here
// TODO: example 1
// FIXME: Please change BASE url before live
很容易找到这样的方法
//MARK:
在Xcode 6.3.2中似乎不适用于我。但是,这就是我要做的事情:
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)
成为跳转栏中最右边的条目,我必须单击方法上方的空白。
Apple在最新版本的Building Cocoa Apps中声明,
Swift编译器不包含预处理器。相反,它利用编译时属性,构建配置和语言功能来实现相同的功能。因此,预处理器指令不会导入Swift中。
#字符似乎仍然是您使用各种构建配置和类似内容的方式,但是看起来它们正在设法减少您对大多数预处理的需求,并将其带到其他语言功能。也许这是为了帮助Playgrounds和REPL的操作尽可能接近完全编译的代码。
尝试这个:
// MARK: Reload TableView
func reloadTableView(){
tableView.reload()
}
实用标记是提高代码可读性的一种方法。杂注注释会像Xcode跳转栏上的标签一样出现。
//MARK: <Your comment goes here>
示例:在代码中,
//MARK: Properties
// MARK: View Life cycle
//MARK: Helper methods
这就是它出现在Xcode跳转栏中的方式。