tutorial - Swift中的#pragma標記?




swift語言 (10)

在Objective C中,我可以使用#pragma mark在符號導航器中標記我的代碼的各個部分。 由於這是一個C預處理器命令,因此它在Swift中不可用。 在Swift中是否有這樣的替身,還是我不得不使用醜陋的評論?


Xcode 8現在按照以下方式處理它,並在方法下拉菜單中顯示:


//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:comment的效果,即標題“我的酷方法”:

3)我還注意到,如果我單擊我的代碼中的某個方法,那麼該方法將成為跳轉條中最右邊的條目。 為了讓MainWindowController(with a leading C icon)成為跳轉條中最右邊的條目,我必須點擊我的方法上面的空格。


今天早上在WWDC的一個蘋果工程師在Swift實驗室證實,目前沒有任何#pragma或等價物,他們認為這是一個錯誤,它會很快到達,所以我猜測測試版2,我希望。

無論如何,這是它的方式。

Xcode現在支持// MARK :, // TODO:和// FIXME地標來註釋您的代碼並將它們列在跳轉欄中


使用

// MARK: SectionName

要么

// MARK: - SectionName

這將在編譯標記上方顯示一行,使其更具可讀性。

為了便於添加

// MARK: - <#label#>

到你的代碼片段。

替代方式 -

以這種方式使用它

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

這不僅會添加標記(就像編譯標記一樣),而且還會很好地分離代碼。


專業程序員必須使用此標籤才能獲得良好的代碼。 這對團隊合作也很有幫助。

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


對於那些有興趣使用擴展名和雜注標記的人(如第一條評論所述),以下是如何從Swift Engineer實現它:

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
    }

}

這也不一定是最好的做法,但如果你喜歡,這就是你的做法。


您可以使用// MARK:// MARK:-很快捷。 第二個選項也添加分隔線。


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

直到Xcode 5,預處理器指令#pragma mark存在。

從Xcode 6開始,您必須使用// MARK:

這些預處理器功能允許將某些結構帶入源代碼編輯器的功能下拉框。

一些例子 :

// MARK:

- >之前會有一個水平分隔符

// MARK: your text goes here

- >在下拉列表中將'您的文本放在這裡'以粗體顯示

// MARK: - your text goes here

- >在下拉列表中將'您的文本放在這裡'以粗體顯示,前面是水平分隔線

更新:添加屏幕截圖'因為有些人似乎仍然有這個問題:


蘋果在最新版本的建築可可應用程序中聲明

Swift編譯器不包含預處理器。 相反,它利用編譯時屬性,構建配置和語言功能來實現相同的功能。 因此,Swift中不會導入預處理器指令。

#字符似乎仍然是你如何使用各種構建配置和類似的東西,但看起來他們正試圖減少對大多數預處理的需求,並且將其轉化為其他語言特性。 也許這是為了幫助操作Playgrounds和REPL盡可能接近完全編譯的代碼。





swift