#pragma mark in Swift?


936

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


15
長いコードを整理することは非常に重要です。
iPatel

コメントとセクションマーキングの間にすぐに目に見える違いはなくなったようです。拡張機能には名前が付けられていないため、2つのタイプのコメントを区別する唯一の方法は別個のファイルのようです
Stephen J

1
これを確認できます:stackoverflow.com/a/33040068/1753005
Jayprakash Dubey

1
他のSwiftとXcodeの初心者のために、誰もが話している「シンボルナビゲーター」は、編集ウィンドウの上部にある「ジャンプバー」の右端をクリックすると表示されるものだということだけを述べておきます。左側のパネルのシンボルナビゲーターではありません。
RenniePet 2017年

1
@HarshilKotecha Swiftは、実行するプラットフォームに依存しないプログラミング言語です。PragmaマークはSwiftの一部であり、Linux、macOS、およびiOSを含む他のAppleプラットフォームで使用できます。プラグママークはプラットフォームではなくSwift自体の機能であるため、この質問にこれらのプラットフォームのタグを付けるのはばかげています。iOSは、Swiftが実行される多くのプラットフォームの1つにすぎません。これは理解することが重要です。この質問はiOSに関するものではなく、LinuxやmacOSに関するものでもありません。Swiftについてです。
Eric Aya

回答:


1202

使用できます // MARK:


とにかく、クラス拡張の寛大な使用がとにかくより良い実践であるかもしれないという議論もありました。拡張機能はプロトコルを実装できるため、たとえば、すべてのテーブルビューデリゲートメソッドを拡張機能に配置し、コードを#pragma mark可能な範囲よりもセマンティックレベルでグループ化できます。


64
そして、はい、新しい開発者契約により、このことについて話すことができます:)
Frank Schmitt 14年

4
拡張機能を使用して、NSCodingなどのinitメソッドを持つプロトコルを保持することはできません。そのため、すべてのケースで使用できないと、分離が難しくなります。
マシュークニッペン2014年

149
ベータ4のとおり、Xcodeの6が認識し// MARK:// TODO:そして// FIXMEジャンプバーでスウィフトソースとリストにそれらをに。(ところで、これは(Obj)Cソースで既に実行されています- #pragma markこれが唯一の方法ではありません。)はい、追加-してMARK、メニューにセパレータを配置できます。
リクスター14

17
拡張機能を推奨するための+1。現在機能しMARKている場合でも、拡張機能を使用して、意味的に関連するある種のコード(特にプロトコルの実装)をグループ化すると便利です。私見では、プロトコル適合宣言を実装するメソッドのすぐ隣に置く方がずっと読みやすく、ファイルの上部に5つのプロトコル宣言がなく、下のどこかにランダムに50の関連するメソッド実装が散在しています。
リクスター14

37
@StevenKramer:と同じ方法#pragma mark// MARK: -は単なる// MARK: - stuffセパレーターであり、セパレーターとヘッダーを// MARK: - stuff -提供し、1つのコメント行にセパレーター、ヘッダー、および別のセパレーターをすべて提供します。
リクスター

174

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

Xcode 6以降では、使用する必要があります // MARK:

これらのプリプロセッサ機能により、ソースコードエディターの関数ドロップダウンボックスに構造を持たせることができます。

いくつかの例 :

// MARK:

->水平分割線が先行する

// MARK: your text goes here

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

// MARK: - your text goes here

->「あなたのテキストはここに行く」をドロップダウンリストに太字で置き、その前に水平の区切り線を置きます

更新:スクリーンショットを追加しました。これは、一部の人々がまだこれで問題を抱えているように見えるためです:

ここに画像の説明を入力してください


1
XCode 6.1.1で使用// MARK: - textしているセパレータはなく、ドロップダウンリストには、単なるテキストではなくMARK:テキスト表示されます
mostruash 2015

Xcode 6.1.1で問題なく動作します。スクリーンショットを追加しました。コードを確認してください。
Ronny Webers、2015

Objective-Cファイルで試したことを忘れていました。努力のために投票してください、ありがとう。
mostruash 2015

1
わかりました、今では明らかです:-)最初の質問はSwiftについて尋ねているので、私はそれを考えていませんでした。:完全性について:Objective-Cであなたが使用して同じことを行うことができます あなたのマーカーのテキストがここに行く-の#pragmaマーク、または単に-の#pragmaマークを使用すると、バーが必要な場合、またはあなたのマーカーのテキストをここにマークの#pragma同じを取得しますバーなし。(申し訳ありませんが、コードフラグメントの正しいマークアップを取得できません。それらを太字にしています)
Ronny Webers

Xcode 8.1で少し変更されましたが、このルールは一般的に機能しており、この回答を最高に優先してください:D
windsound 2016年

167

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

}

これは必ずしもベストプラクティスであるとは限りませんが、必要に応じてこれを行うことができます。


6
これはとてもクールですが、拡張機能に名前を付けることができればすばらしいでしょう。
マシュー・ニッペン2014

16
@Matthew-使用できますtypealias。例えばtypealias DataSource = SwiftTableViewController。その後extension Datasource {}
Logan

1
@PhongLe UITableViewControllerはプロトコルではなく、クラスです。おそらくを意味しますUITableViewControllerDataSourceが、これは例で使用されているパターンではありません。
KPM

4
なぜextensionプロトコルにヘッダーが付いていないのか疑問に思っていextension SwiftTableViewController : UITableViewControllerます。たとえば、クラスにその拡張機能を追加した理由を理解する方が読みやすいでしょう。
holex

7
あなたの拡張機能は、単にプロトコルの実装として機能するように存在している場合、あなたがいることを注意することができ拡張子に名前を付ける:extension SwiftTableViewController : UITableViewDelegate { .. }extension SwiftTableViewController : UITableViewDatasource { .. }
クレイグ・オーティス

117

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

Swiftではこれを使用してこれを達成できますMARK, TODO OR FIXME

私。マーク: //MARK: viewDidLoad

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

スクリーンショット1

ii。TODO: //TODO: - viewDidLoad

これにより、機能がTODOの下にグループ化されます。-viewDidLoadカテゴリ(スクリーンショット2に表示)

スクリーンショット2

iii。FIXME: //FIXME - viewDidLoad

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

スクリーンショット3

詳細については、このアップルのドキュメントを確認してください。


TODOおよびFIXMEの後の「-」は何もしないことに注意してください。「-」はMARKディレクティブにのみ関連します。
rismay 2016

1
また、ソースファイルの右側に沿って表示できる、コード「ミニマップ」内に大文字の大きなセクション見出しを作成します。かなり便利です。
オスカー

66

公式ドキュメント

Xcode Jump Barに関するAppleの公式ドキュメント:コード注釈をジャンプバーに追加する

サンプルコードのジャンプバーのスクリーンショット

サンプルコード

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

Xcode 10.1およびmacOS 10.14.3

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

Xcode 10.0およびmacOS 10.13.4

Xcode 9.4.1およびmacOS 10.13.0での動作

Xcode 9.4.1およびmacOS 10.13.0

討論

!!!:そして???:時々表示することができない。


!!!:および???:構文がXcode 11.3.1で機能しない
Jayprakash Dubey

56

Objective-Cコード// MARK: - fooでは、Xcodeは次のようなコメントを検出します。#pragma。しかし、これらも(まだ?)拾われていないようです。

編集:Xcode 6ベータ4で修正されました。


6
私はすべてがプラグママークで構成されたままにしたいので、それらがすぐに利用可能になることを願っています>。<
Arbitur

1
// MARK: -現時点では機能していないことが確認できます。
Rui Peres

機能していませんが、サンプルコードにはそのスタイルのコメントが散らかっているため、最終的にはピックアップする必要があります。
ネイト・クック

1
コメントが移植可能であることは重要ですか?Swiftコードを他の言語に直接移植することは、開発者にとってすでに困難なためです。
holex 2014年

うーん、私はそれがうまくいくと多くの人がコメントしているのを見ていますが、私はベータ6を// MARK:使っていて、うまくいっていないようです。私はスペースを入れて、入れずに、コロンを付けて、付けずに、すべて大文字で混合して(マーク)試しました。トリックはありますか?設定などをアクティブにする必要がありますか?
Olie

37

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

6
その可能性はプラグマよりもはるかに大きいと思いますが、プラグマのように拡張機能がドロップダウンメニューにプロトコル名やカスタム名を表示しないため、現時点ではプラグマの方が優れています(下記のWhasssaaahhhの回答を参照
nacho4d

新しい「// MARK:」コードは便利ですが、拡張機能の使用方法の明確な例、特にデリゲート関数についても気に入っています。
ElmerCat 2015年

拡張機能はまた、実行できることを制限します-たとえば、保存されたプロパティがない
混乱Vorlon

1
extensionXcodeのブレッドクラムコントロールのドロップダウンメニューでは、1つだけでは目立たないため、両方を使用します。
Nicolas Miari 2017年

36

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

ここに画像の説明を入力してください


マークはどうですか?// ARK: Xcode 8の私のように表示されます
fnc12

コードを確認してください。//MARK:行の上にいくつかのUnicode文字を使用している可能性があります。何らかの理由でxcodeは混乱し(そして吸うため)、それを処理できません。
carlos_ms 2017年

3
構文のXcode 8.3.3 ...上で作業していないと思われる!!!???
クリス・フレデリック

@ChrisFrederickでも!!! そして??? Xocde 11.3.1で動作しないようです
Jayprakash Dubey

34

今朝WWDCでSwiftラボのAppleエンジニアに確認されましたが、現時点では#pragmaまたは同等のものはありません。彼らはこれをバグと見なしており、間もなく届くので、ベータ2と思います。

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


Xcodeは// MARK:、// TODO:および// FIXMEランドマークをサポートして、コードに注釈を付け、それらをジャンプバーにリストします


6
Beta 2にはまだありません
cescofry 2014年

奇妙な。私にとってはうまくいきます。PS:Xcodeを更新してください。
Daniel

@ダニエル:Xcodeのどのバージョン?Xcode 6.4を使用していますが、動作していないようです。
Jayprakash Dubey

19

追加する3つのオプションがあります #pragma_markSwift:

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

注:-セパレーターの追加の使用


17

使用する

// MARK: SectionName

または

// MARK: - SectionName

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

簡単に追加するだけです

// MARK: - <#label#>

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

別の方法-

このように使用する

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

これにより、(プラグママークのように)マークが追加されるだけでなく、コードが適切に分離されます。


1
あなたが使用している場合はSwiftlintを、それは文句を言うでしょう//MARK形式(スペースなし)と示唆// MARK: (text)1つのスペースの間//とMARK、スペースなしの間MARK:し、1つのスペースの間:とセクション名)
ニコラ・Miari

2
@NicolasMiari、ありがとう、あなたの提案に従って編集しました。また、次のプロジェクトでSwiftLintを使用してみます。:)
Nikhil Manapure 2017年

13
//# MARK: - Spinner Class Methods

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

  1. //#MARK:–テキストメソッド(LINE)
  2. //#マーク:テキストメソッド(行なし)

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

ここに画像の説明を入力してください


12

次のようなSwift 4.2 / XCode 10コンパイラ指令にも興味があるかもしれません

#warning("Some string to display")

そして

#error("Some error to display")

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

ここに画像の説明を入力してください


涼しい。違反したボーイスカウトが先に支配するとき、他のチームメイトに警告します。
Sazzad Hissain Khan

9

プロのプログラマーは、適切なコードのためにこのタグを使用する必要があります。チームワークにも最適です。

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

このような方法を見つけるのは簡単です

このような方法を見つけるのは簡単です


6

Xcode 11では、アクティブ化できるミニマップを追加しました Editor -> Minimap

ミニマップは、コードで高速方向付けのために各マークテキストを表示します。各マークは次のように書かれています// MARK: Variables

ここに画像の説明を入力してください


5

//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:コメントの効果、つまり「My cool methods」という見出しが表示されます。

ここに画像の説明を入力してください

3)コードのメソッドの1つをクリックすると、そのメソッドがジャンプバーの右端のエントリになることにも気付きました。MainWindowController(with a leading C icon)ジャンプバーの右端のエントリになるためには、メソッドの上にある空白をクリックする必要があります。


それがどうあるべきかということではありませんか?あなたはトップバーをクリックしなければならないこと?
Arbitur 2015

3

Appleは、Building Cocoa Appsの最新バージョンで、

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

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


0

To-Doアイテムを追加:プレフィックスTODO:のコメントを挿入します。例:// TODO:[あなたのTo-Doアイテム]。

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

見出しを追加:プレフィックスMARK:でコメントを挿入します。例://マーク:[セクションの見出し]。

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



0

プラグママークは、コードを読みやすくするための方法です。プラグマのコメントは、Xcodeジャンプバーのタグのように表示されます。

//MARK:  <Your comment goes here>

例:コードでは、

//MARK: Properties

// MARK: View Life cycle

//MARK: Helper methods

これは、Xcodeジャンプバーに表示される方法です。

ここに画像の説明を入力してください


それらをファイルの正しい場所に挿入する必要があります。
varunrathi28
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.