Tanda #pragma di Swift?


936

Di Objective C, saya dapat menggunakan #pragma markuntuk menandai bagian dari kode saya di navigator simbol. Karena ini adalah perintah preprocessor C, itu tidak tersedia di Swift. Apakah ada alasan untuk ini di Swift, atau apakah saya harus menggunakan komentar jelek?


15
Sangat penting untuk mengatur kode panjang kami.
iPatel

Tampaknya tidak ada lagi perbedaan yang cepat terlihat antara komentar dan tanda bagian. Ekstensi tidak diberi nama, jadi file yang terpisah tampaknya menjadi satu-satunya cara untuk menggambarkan di antara kedua jenis komentar
Stephen J

1
Anda dapat memeriksa yang ini: stackoverflow.com/a/33040068/1753005
Jayprakash Dubey

1
Untuk pemula Swift dan Xcode lainnya, saya hanya akan menyebutkan bahwa "simbol navigator" yang dibicarakan semua orang adalah yang Anda dapatkan ketika Anda mengklik pada hal paling kanan di "lompat bilah" di bagian atas jendela pengeditan. Ini bukan navigator simbol di panel kiri.
RenniePet

1
@HarshilKotecha Swift adalah bahasa pemrograman yang independen dari platform yang digunakannya. Tanda Pragma adalah bagian dari Swift dan dapat digunakan di Linux, macOS dan platform Apple lainnya termasuk iOS. Akan konyol untuk menandai pertanyaan ini dengan salah satu platform ini karena tanda pragma adalah fitur Swift itu sendiri, bukan dari platform. iOS hanya satu dari banyak platform tempat Swift beroperasi. Ini penting untuk dipahami. Pertanyaan ini bukan tentang iOS, dan juga bukan tentang Linux atau macOS. Ini tentang Swift.
Eric Aya

Jawaban:


1202

Kamu bisa menggunakan // MARK:


Ada juga diskusi bahwa penggunaan liberal ekstensi kelas mungkin merupakan praktik yang lebih baik. Karena ekstensi dapat mengimplementasikan protokol, misalnya Anda dapat meletakkan semua metode delegasi tampilan tabel dalam ekstensi dan mengelompokkan kode Anda pada tingkat yang lebih semantik daripada #pragma markyang mampu dilakukan.


64
Dan ya, perjanjian pengembang yang baru memungkinkan kita membicarakan hal ini :)
Frank Schmitt

4
Anda tidak dapat menggunakan ekstensi untuk memegang protokol yang memiliki metode init, seperti NSCoding. Itu membuatnya sulit untuk dipisahkan jika Anda tidak dapat menggunakannya dalam semua kasus.
Matthew Knippen

149
Pada beta 4, Xcode 6 mengenali // MARK:, // TODO:dan // FIXMEdi sumber Swift dan mendaftar di bilah lompat. (BTW, sudah melakukannya di (Obj) sumber C - #pragma markbukan satu-satunya cara.) Dan ya, Anda masih dapat menambahkan -Anda MARKuntuk meletakkan pemisah di menu.
rickster

17
+1 untuk merekomendasikan ekstensi. Bahkan dengan MARKbekerja sekarang, menggunakan ekstensi untuk mengelompokkan beberapa jenis kode terkait semantik (terutama implementasi protokol) masih bisa bermanfaat. IMHO itu membaca jauh lebih baik untuk memiliki deklarasi kesesuaian protokol Anda tepat di sebelah metode yang mengimplementasikannya, bukan 5 deklarasi protokol di bagian atas file dan 50 implementasi metode terkait yang tersebar secara acak di suatu tempat di bawah ini.
rickster

37
@ SevenKramer: Sama seperti dengan #pragma mark. // MARK: -hanya pemisah, // MARK: - stuffmemberi Anda pemisah dan header, dan // MARK: - stuff -memberi Anda pemisah, header, dan pemisah lainnya semua dalam satu baris komentar.
rickster

174

Hingga Xcode 5 arahan preprosesor #pragma markada.

Dari Xcode 6 aktif, Anda harus menggunakan // MARK:

Fitur-fitur preprocessor ini memungkinkan untuk membawa beberapa struktur ke kotak drop down fungsi editor kode sumber.

beberapa contoh :

// MARK:

-> akan didahului oleh pembagi horizontal

// MARK: your text goes here

-> menempatkan 'teks Anda masuk ke sini' dalam huruf tebal di daftar drop down

// MARK: - your text goes here

-> menempatkan 'teks Anda masuk ke sini' dicetak tebal dalam daftar drop-down, didahului oleh pembagi horizontal

perbarui: menambahkan tangkapan layar karena beberapa orang tampaknya masih memiliki masalah dengan ini:

masukkan deskripsi gambar di sini


1
Tidak ada pemisah di XCode 6.1.1 yang digunakan // MARK: - textuntuk saya dan daftar drop-down menunjukkan MARK: teks bukan hanya teks .
mostruash

berfungsi dengan baik untuk saya di Xcode 6.1.1, saya baru saja menambahkan tangkapan layar - silakan periksa dengan kode Anda?
Ronny Webers

Saya lupa menyebutkan bahwa saya mencobanya untuk file Objective-C. Voting up untuk upaya ini, terima kasih.
mostruash

1
Begitu ya, sekarang sudah jelas :-) Pertanyaan awal menanyakan tentang Swift jadi saya tidak memikirkan itu. Untuk kelengkapan: di Objective-C Anda dapat melakukan hal yang sama dengan menggunakan: #pragma mark - Teks penanda Anda ada di sini , atau hanya tanda #pragma - jika Anda memerlukan bilah, atau # tanda pragma Teks penanda Anda pergi ke sini untuk mendapatkan yang sama tanpa bar. (maaf, saya tidak bisa mendapatkan markup yang benar untuk fragmen kode, saya telah membuatnya dalam huruf tebal)
Ronny Webers

Itu berubah sedikit di Xcode 8.1, tetapi aturan ini umumnya berfungsi, lebih suka jawaban ini yang terbaik: D
windsound

167

Bagi mereka yang tertarik menggunakan ekstensi vs tanda pragma (seperti yang disebutkan dalam komentar pertama), berikut adalah cara menerapkannya dari Insinyur 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
    }

}

Ini juga belum tentu praktik terbaik, tetapi ini adalah bagaimana Anda melakukannya jika Anda mau.


6
Ini sangat keren, tetapi alangkah baiknya jika ekstensi dapat memiliki nama.
Matthew Knippen

16
@ Matius - Anda bisa menggunakan typealias. Sebagai contoh typealias DataSource = SwiftTableViewController. Kemudianextension Datasource {}
Logan

1
@PhongLe UITableViewControllerbukan protokol, ini adalah kelas. Anda mungkin bermaksud UITableViewControllerDataSource, tetapi ini bukan pola yang digunakan dalam contoh.
KPM

4
Saya hanya ingin tahu mengapa belum extensionmendapatkan header dengan protokol, seperti extension SwiftTableViewController : UITableViewController, akan lebih mudah dibaca untuk melihat mengapa Anda menambahkan ekstensi itu ke kelas.
holex

7
Perhatikan bahwa jika ekstensi Anda ada hanya untuk bertindak sebagai implementasi protokol, Anda dapat menyebutkan ekstensi: extension SwiftTableViewController : UITableViewDelegate { .. }danextension SwiftTableViewController : UITableViewDatasource { .. }
Craig Otis

117

Pragma mark - [SOME TEXT HERE]digunakan dalam Objective-C untuk mengelompokkan beberapa fungsi bersama dengan memisahkan garis.

Di Swift Anda dapat mencapai ini dengan menggunakanMARK, TODO OR FIXME

saya. MARK: //MARK: viewDidLoad

Ini akan membuat garis horizontal dengan fungsi yang dikelompokkan di bawah viewDidLoad (ditunjukkan pada tangkapan layar 1)

Tangkapan layar 1

ii. MELAKUKAN : //TODO: - viewDidLoad

Ini akan mengelompokkan fungsi di bawah TODO: - Kategori viewDidLoad (ditunjukkan pada tangkapan layar 2)

Tangkapan layar 2

aku aku aku. PERBAIKI AKU : //FIXME - viewDidLoad

Ini akan mengelompokkan fungsi di bawah FIXME: - kategori viewDidLoad (ditunjukkan pada tangkapan layar 3)

Tangkapan layar 3

Periksa dokumentasi apel ini untuk detailnya.


Perhatikan bahwa "-" setelah TODO dan FIXME tidak melakukan apa pun. "-" hanya relevan untuk arahan MARK.
rismay

1
Ini juga membuat judul bagian besar yang dikapitalisasi dalam kode "minimap" yang dapat Anda tampilkan di sepanjang sisi kanan file sumber. Cukup berguna.
Oscar

66

Dokumentasi Resmi

Dokumen resmi Apple tentang Bilah Lompat Xcode: Tambahkan anotasi kode ke bilah lompat

Jump Bar Screenshot untuk Contoh Kode

Kode sampel

Perilaku dalam Xcode 10.1 dan macOS 10.14.3 (Mojave)

Xcode 10.1 dan macOS 10.14.3

Perilaku dalam Xcode 10.0 dan macOS 10.13.4 (High Sierra)

Xcode 10.0 dan macOS 10.13.4

Perilaku dalam Xcode 9.4.1 dan macOS 10.13.0

Xcode 9.4.1 dan macOS 10.13.0

Diskusi

!!!:dan ???:terkadang tidak dapat ditampilkan.


!!!: and ???: sintaks tidak berfungsi pada Xcode 11.3.1
Jayprakash Dubey

56

Dalam kode Objective-C Xcode mendeteksi komentar seperti // MARK: - fooyang sedikit lebih portabel daripada #pragma. Tapi ini sepertinya tidak diambil juga (belum?).

Sunting: Diperbaiki dalam Xcode 6 beta 4.


6
Saya yakin mereka segera menyediakannya karena saya suka mengatur semuanya dengan tanda pragma>. <
Arbitur

1
Saya dapat mengkonfirmasi bahwa // MARK: -ini tidak berfungsi untuk saat ini.
Rui Peres

Tidak berfungsi, tetapi kode sampel dikotori dengan gaya komentar itu, jadi akhirnya harus diambil.
Nate Cook

1
apakah penting komentarnya harus portabel? karena porting kode Swift ke bahasa lain secara langsung sudah menjadi tantangan bagi pengembang.
holex

Hmmm, saya melihat banyak orang berkomentar itu berfungsi, tapi saya menggunakan Beta 6 dan // MARK:sepertinya tidak berfungsi. Saya sudah mencoba dengan & tanpa spasi, dengan dan tanpa titik dua, semua-topi dan campuran (Mark). Apakah ada trik? Apakah saya perlu mengaktifkan pref atau sesuatu?
Olie

37

Saya pikir Extensionsitu cara yang lebih baik #pragma mark.

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

Kode setelah menggunakan 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
Saya pikir potensinya jauh lebih daripada pragmas tetapi saat ini pragmas masih lebih baik karena ekstensi tidak menampilkan nama protokol atau nama khusus dalam menu drop down seperti pragma lakukan ( lihat di bawah jawaban
Whasssaaahhh

Kode "// MARK:" yang baru berguna, tetapi saya juga menyukai contoh jelas Anda tentang cara menggunakan ekstensi - terutama untuk fungsi delegasi!
ElmerCat

ekstensi juga membatasi apa yang dapat Anda lakukan - mis. tidak ada properti tersimpan
Bingung Vorlon

1
Saya menggunakan keduanya, karena itu extensionsaja tidak benar-benar menonjol dalam menu dropdown kontrol remah roti Xcode.
Nicolas Miari

36

Xcode 8 sekarang menanganinya sebagai diikuti dan muncul seperti ini di dropdown metode:

masukkan deskripsi gambar di sini


bagaimana dengan MARK:? Ini menunjukkan // ARK: bagi saya di Xcode 8
fnc12

Periksa kode Anda, Anda mungkin menggunakan beberapa karakter unicode di atas baris // MARK: Anda. Untuk beberapa alasan xcode menjadi bingung (dan karena sucks), dan tidak dapat mengatasinya.
carlos_ms

3
The !!!dan ???sintaks tidak muncul untuk dapat bekerja pada Xcode 8.3.3 ...
Chris Frederick

@ChrisFrederick Even !!! dan ??? dosen't tampaknya bekerja pada Xocde 11.3.1
Jayprakash Dubey

34

Dikonfirmasi dengan Apple Engineer di lab Swift pagi ini di WWDC bahwa saat ini tidak ada #pragma atau yang setara, mereka menganggap ini bug, dan akan segera tiba, jadi saya menduga beta 2, saya harap.

Pokoknya, ini jalannya.


Xcode sekarang mendukung // MARK :, // TODO: dan // landmark FIXME untuk membubuhi keterangan kode Anda dan mencantumkannya di bilah lompat


6
Beta 2, belum memilikinya
cescofry

Aneh. Bekerja untuk saya baik-baik saja. PS: perbarui Xcode Anda.
Daniel

@Aniel: Xcode versi apa? Saya menggunakan Xcode 6.4 dan sepertinya tidak bekerja.
Jayprakash Dubey

19

Ada Tiga opsi untuk ditambahkan #pragma_markdi Swift:

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

Catatan: Penggunaan -untuk menambahkan pemisah


17

Menggunakan

// MARK: SectionName

atau

// MARK: - SectionName

Ini akan memberikan garis di atas tanda pragma, membuatnya lebih mudah dibaca.

Untuk memudahkan, tambahkan saja

// MARK: - <#label#>

ke cuplikan kode Anda.

Cara alternatif -

Gunakan dengan cara ini

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

Ini tidak hanya akan menambah tanda (seperti tanda pragma) tetapi juga memisahkan kode dengan baik.


1
Jika Anda menggunakan Swiftlint , ia akan mengeluh tentang //MARKformat (tanpa spasi) dan menyarankan // MARK: (text)( satu spasi antara //dan MARK, tidak ada ruang antara MARKdan :, dan satu spasi antara :dan nama bagian)
Nicolas Miari

2
@ NicolasMiari, Terima kasih, saya telah mengedit sesuai dengan saran Anda. Dan juga akan mencoba menggunakan SwiftLint untuk proyek selanjutnya. :)
Nikhil Manapure

13
//# MARK: - Spinner Class Methods

Tambahkan garis antara titik dua dan deskripsi Anda untuk menyisipkan garis pemisah. Ini membantu mengatur lebih banyak kode Anda. Kode dan tangkapan layar di atas memanfaatkan komentar MARK dengan garis yang disertakan.

  1. // # MARK: - Metode Teks (LINE)
  2. // # MARK: Metode Teks (TANPA LINE)

Ini hanya berfungsi dengan komentar MARK.

masukkan deskripsi gambar di sini


12

Anda juga mungkin tertarik dengan arahan kompiler Swift 4.2 / XCode 10 suka

#warning("Some string to display")

dan

#error("Some error to display")

Ini mungkin berguna ketika Anda benar-benar tidak ingin ketinggalan sesuatu.

masukkan deskripsi gambar di sini


Keren. Saya akan memperingatkan rekan satu tim lainnya ketika anak pramuka yang melanggar aturan maju.
Sazzad Hissain Khan

9

Pemrogram profesional harus menggunakan tag ini untuk kode yang baik. Ini juga bagus untuk kerja tim.

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

Sangat mudah untuk menemukan metode seperti ini

Sangat mudah untuk menemukan metode seperti ini


6

Dalam Xcode 11 mereka menambahkan minimap yang dapat diaktifkan Editor -> Minimap.

Minimap akan menampilkan setiap teks tanda untuk orientasi cepat dalam kode. Setiap tanda ditulis seperti// MARK: Variables

masukkan deskripsi gambar di sini


5

//MARK:tidak tampak bekerja untuk saya di Xcode 6.3.2. Namun, inilah yang saya lakukan untuk membuatnya bekerja :

1) Kode:

import Cocoa

class MainWindowController: NSWindowController {

    //MARK: - My cool methods

    func fly() {
    }

    func turnInvisible() {

    }
}

2) Dalam jump barapa - apa tampaknya tidak berubah ketika menambahkan //MARK: komentar. Namun, jika saya mengklik nama paling kanan di bilah lompat, dalam kasus saya dikatakan MainWindowController(with a leading C icon), maka jendela sembulan akan menampilkan yang menunjukkan efek dari // MARK: komentar, yaitu tajuk yang mengatakan "Metode keren saya":

masukkan deskripsi gambar di sini

3) Saya juga memperhatikan bahwa jika saya mengklik salah satu metode dalam kode saya, maka metode tersebut menjadi entri paling kanan di bilah lompat. Untuk bisa MainWindowController(with a leading C icon)menjadi entri paling kanan di panel lompat, saya harus mengklik spasi putih di atas metode saya.


Bukankah itu seharusnya? Anda harus mengklik bilah bagian atas?
Arbitur

3

Apple menyatakan dalam versi terbaru dari Building Cocoa Apps ,

Kompiler Swift tidak termasuk preprosesor. Alih-alih, itu mengambil keuntungan dari atribut waktu kompilasi, membangun konfigurasi, dan fitur bahasa untuk mencapai fungsi yang sama. Karena alasan ini, arahan preprosesor tidak diimpor dalam Swift.

Karakter # tampaknya masih menjadi cara Anda bekerja dengan berbagai konfigurasi bangunan dan hal-hal seperti itu, tetapi sepertinya mereka berusaha mengurangi kebutuhan Anda akan sebagian besar pemrosesan awal dalam nada pragma dan meneruskan Anda ke fitur bahasa lainnya secara bersamaan. Mungkin ini untuk membantu pengoperasian Playgrounds dan REPL berperilaku sedekat mungkin dengan kode yang sepenuhnya dikompilasi.


0

Tambahkan item yang harus dilakukan: Masukkan komentar dengan awalan TODO :. Misalnya: // TODO: [item agenda Anda].

Tambahkan pengingat perbaikan bug: Masukkan komentar dengan awalan FIXME :. Misalnya: // FIXME: [pengingat perbaikan bug Anda].

Tambahkan judul: Masukkan komentar dengan awalan MARK :. Misalnya: // MARK: [heading bagian Anda].

Tambahkan garis pemisah: Untuk menambahkan pemisah di atas anotasi, tambahkan tanda hubung (-) sebelum bagian komentar dari anotasi. Misalnya: // MARK: - [konten Anda]. Untuk menambahkan pemisah di bawah anotasi, tambahkan tanda hubung (-) setelah bagian komentar dari anotasi. Misalnya: // MARK: [konten Anda] -.


0

Coba ini:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}

0

Tanda Pragma adalah cara untuk meningkatkan keterbacaan kode Anda. Komentar pragma akan muncul seperti tag pada jumpbar Xcode.

//MARK:  <Your comment goes here>

Contoh: Dalam kode,

//MARK: Properties

// MARK: View Life cycle

//MARK: Helper methods

Beginilah tampilannya di bilah lompat Xcode.

masukkan deskripsi gambar di sini


Anda hanya perlu memasukkannya di tempat yang benar dalam file Anda.
varunrathi28
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.