web-dev-qa-db-ja.com

Swiftで#pragma mark?

Objective Cでは、#pragma markを使用して、シンボルナビゲータでコードの一部にマークを付けることができます。これはCのプリプロセッサコマンドなので、Swiftでは使用できません。 Swiftでこれに代わるものがありますか、それとも私は醜いコメントを使用する必要がありますか?

877
Arbitur

あなたは// MARK:を使うことができます


とにかくクラス拡張の自由な使用がより良い習慣であるかもしれないという議論もありました。エクステンションはプロトコルを実装することができるので、あなたはすることができます。すべてのTable Viewデリゲートメソッドを拡張機能に配置し、コードを#pragma markで可能なレベル以上の意味レベルでグループ化します。

1124
Frank Schmitt

拡張機能とプラグママークの使用に興味がある人のために(最初のコメントで述べたように)、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
    }

}

それはまた、必ずしもベストプラクティスではありませんが、これはあなたが好きならばあなたがそうする方法です。

163
NatashaTheRobot

Xcode 5までは、プリプロセッサディレクティブ#pragma markが存在していました。

Xcode 6から、あなたは// MARK:を使わなければなりません

これらのプリプロセッサ機能により、ソースコードエディタの機能ドロップダウンボックスに何らかの構造を取り込むことができます。

いくつかの例 :

// MARK:

- >の前に水平方向の区切り線が付きます

// MARK: your text goes here

- >ドロップダウンリストに「あなたのテキストはここにあります」を太字で表示します。

// MARK: - your text goes here

- >ドロップダウンリストで、「あなたのテキストはここに入っています」を太字で表示します。

更新:スクリーンショットを追加 '一部の人々はまだこれに問題があるようです:

enter image description here

162
Ronny Webers

Pragma mark - [SOME TEXT HERE] Objective-Cで複数の関数をグループ化するために で行区切りで使用されていました。

Swift では、MARK, TODO OR FIXMEを使ってこれを達成できます。

私。 MARK: //MARK: viewDidLoad

これにより、viewDidLoadの下にグループ化された関数を含む 水平線 が作成されます(スクリーンショット1)。

Screenshot 1

ii。 TODO: //TODO: - viewDidLoad

これは TODO: - viewDidLoad categoryの下に機能をグループ化します(スクリーンショット2に表示)

Screenshot 2

iii。 FIXME: //FIXME - viewDidLoad

これにより、 FIXME: - viewDidLoad categoryの下に機能がグループ化されます(スクリーンショット3)。

Screenshot 3

111

Objective-Cコードでは、Xcodeは// MARK: - fooよりも移植性が高い#pragmaのようなコメントを検出します。しかし、これらも取り上げられていないようです(まだ?)。

編集:Xcode 6 beta 4で修正されました。

56
Nikolai Ruhe

公式文書

Xcode Jump Barに関するAppleの公式文書: ジャンプバーにコード注釈を追加します

サンプルコードのJump Barスクリーンショット

Sample Code

Xcode 10.1およびmacOS 10.14.3(Mojave)での動作

Xcode 10.1 and macOS 10.14.3

Xcode 10.0およびmacOS 10.13.4(High Sierra)での動作

Xcode 10.0 and macOS 10.13.4

Xcode 9.4.1およびmacOS 10.13.0での動作

Xcode 9.4.1 and macOS 10.13.0

討論

!!!:???:は表示できないことがあります。

40
George

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

Xcode 8はこれを次のように処理し、メソッドドロップダウンに次のように表示されます。

enter image description here

35
Antoine

今朝WWDCでSwiftラボのアップルエンジニアに、現時点で#pragmaや同等のものは現在ないことを確認し、彼らはこれをバグと見なしており、まもなくベータ2が来ると思いますので、私は希望します。

とにかく、それは途中です。


Xcodeは、コードに注釈を付けるために// MARK:、// TODO:、および// FIXMEのランドマークをサポートし、それらをジャンプバーに表示するようになりました

33
Daniel

Swiftに#pragma_markを追加する方法は3つあります。

1)// MARK: - your text here -

2)// TODO: - your text here -

3)// FIXME: - your text here -

注:追加区切り文字に-を使用します

19
Jaydip

つかいます

// MARK: SectionName

または

// MARK: - SectionName

これにより、プラグママークの上に1行が表示され、読みやすくなります。

簡単に追加するだけで

// MARK: - <#label#>

あなたのコードスニペットに。

別の方法 -

このように使ってください

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

これは(プラグママークのように)マークを追加するだけでなく、コードをきれいに分離します。

16
Nikhil Manapure
//# MARK: - Spinner Class Methods

コロンと説明の間に区切り線を挿入する行を追加します。これにより、コードをさらに整理することができます。上記のコードとスクリーンショットは、コメント付きの行を含めてMARKコメントを使用しています。

  1. //#MARK: - テキストメソッド(LINE)
  2. //#MARK:テキストメソッド(NO LINE)

これはMARKコメントでのみ機能します。

enter image description here

13
aashish tamsya

プロのプログラマーは良いコードのためにこのタグを使わなければなりません。チームワークにも適しています。

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

このような方法は見つけやすいです

It is easy to find method like this

8
Harshil Kotecha

Swift 4.2/XCode 10 コンパイラ指令にも興味がある可能性があります。

#warning("Some string to display")

そして

#error("Some error to display")

あなたが本当に何かを見逃したくないときにそれは役に立つかもしれません。

enter image description here

6
fewlinesofcode

//MARK:seemになりません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:コメントの効果を示すポップアップウィンドウが表示されます。つまり、 "My cool methods"と表示されます。

enter image description here

3)私は、コード内のメソッドの1つをクリックすると、そのメソッドがジャンプバーの一番右のエントリになることにも気付きます。 MainWindowController(with a leading C icon)をジャンプバーの一番右のエントリにするためには、私は自分のメソッドの上にある空白をクリックしなければなりません。

5
7stud

Appleは Building Cocoa Apps の最新バージョンで述べている、

Swiftコンパイラはプリプロセッサを含みません。代わりに、コンパイル時の属性、ビルド構成、および言語機能を利用して同じ機能を実現します。このため、Swiftではプリプロセッサディレクティブはインポートされません。

#文字は、まださまざまなビルド構成やそのようなものを扱う方法のように見えますが、プラグマの中でほとんどの前処理の必要性を減らし、他の言語機能に完全に転送しようとしているようです。おそらくこれは、PlaygroundsとREPLが完全にコンパイルされたコードに可能な限り近い動作をするのを助けるためです。

3
UtopiaLtd

これを試して:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}
0
Nirbhay Singh

やることアイテムを追加する:TODO:という接頭辞を付けてコメントを挿入します。例えば:// TODO:[あなたのしなければならないことのある項目]。

バグ修正のリマインダを追加します。接頭辞FIXME:を付けてコメントを挿入します。例:// FIXME:[あなたのバグ修正のお知らせ]。

見出しを追加する:接頭辞MARK:を付けてコメントを挿入します。例:// MARK:[あなたのセクションの見出し]。

区切り線を追加する:注釈の上に区切り記号を追加するには、注釈のコメント部分の前にハイフン( - )を追加します。例:// MARK: - [あなたのコンテンツ]。注釈の下に区切り記号を追加するには、注釈のコメント部分の後にハイフン( - )を追加します。例:// MARK:[あなたのコンテンツ] - 。

0
Hiren