Swift'te #pragma işareti?


936

Objective C'de, #pragma markkodumun bölümlerini sembol gezgininde işaretlemek için kullanabilirim . Bu bir C önişlemci komutu olduğundan, Swift'te mevcut değildir. Swift'te bunun için bir stand-in var mı, yoksa çirkin yorumlar kullanmak zorunda mıyım?


15
Uzun kodumuzu düzenlemek gerçekten çok önemli.
iPatel

Görünüşe göre yorumlar ve bölüm işaretleri arasında hızla gözle görülür bir fark yok. Uzantılar adlandırılmamıştır, bu nedenle iki yorum türü arasında ayrım yapmanın tek yolu ayrı dosyalar gibi görünmektedir
Stephen J


1
Diğer Swift ve Xcode yeni başlayanlar için, sadece herkesin bahsettiği "sembol navigasyon" un düzenleme penceresinin üstündeki "atlama çubuğundaki" en sağdaki şeyi tıkladığınızda elde ettiğiniz bir şey olduğunu söyleyeceğim. Sol paneldeki sembol gezgini değildir.
RenniePet

1
@HarshilKotecha Swift üzerinde çalıştığı platformdan bağımsız bir programlama dilidir. Pragma mark Swift'in bir parçasıdır ve Linux, macOS ve iOS dahil diğer Apple platformlarında kullanılabilir. Bu soruyu bu platformlardan herhangi biriyle etiketlemek saçma olurdu çünkü pragma işareti, platformun değil Swift'in bir özelliğidir. iOS, Swift'in çalıştığı birçok platformdan sadece biridir. Bunu anlamak önemlidir. Bu soru iOS ile ilgili değil, Linux veya macOS ile de ilgili değil. Swift ile ilgili.
Eric Aya

Yanıtlar:


1202

Kullanabilirsiniz // MARK:


Sınıf uzantılarının liberal kullanımının yine de daha iyi bir uygulama olabileceği konusunda tartışmalar olmuştur. Uzantılar protokolleri uygulayabildiğinden, örneğin tüm tablo görünümü delege yöntemlerinizi bir uzantıya koyabilir ve kodunuzu #pragma markyapabileceğinden daha anlamsal bir düzeyde gruplandırabilirsiniz .


64
Ve evet, yeni geliştirici sözleşmesi bu konu hakkında konuşmamıza izin veriyor :)
Frank Schmitt

4
NSCoding gibi init yöntemi olan bir protokolü tutmak için uzantıları kullanamazsınız. Bu, her durumda kullanamıyorsanız ayrılmasını zorlaştırır.
Matthew Knippen

149
Beta 4'ten itibaren Xcode 6 // MARK:, Swift kaynağını tanır // TODO:ve // FIXMEatlama çubuğunda listeler. (BTW, zaten (Obj) C kaynağında yaptı - #pragma marktek yol değil.) Ve evet, hala menüye ayırıcılar koymak -için ekleyebilirsiniz MARK.
rickster

17
Uzantı önermek için +1. MARKŞimdi çalışırken bile , bazı anlamsal olarak ilgili kodları gruplandırmak için uzantıları kullanmak (özellikle protokol uygulamaları) hala yararlı olabilir. IMHO, protokol uygunluk beyanınızın, dosyanın üstündeki 5 protokol bildirimini değil, aşağıda bir yere rastgele dağılmış 50 ilgili yöntem uygulamasını değil, onu uygulayan yöntemlerin hemen yanında olmasını çok daha iyi okur.
rickster

37
@StevenKramer: ile aynı şekilde #pragma mark. // MARK: -yalnızca bir ayırıcıdır, // MARK: - stuffsize bir ayırıcı ve bir başlık // MARK: - stuff -verir ve bir yorum satırında size bir ayırıcı, bir başlık ve başka bir ayırıcı verir.
rickster

174

Xcode 5'e kadar önişlemci direktifi #pragma markvardı.

Xcode 6'dan itibaren, // MARK:

Bu önişlemci özellikleri, kaynak kodu düzenleyicisinin işlev açılır kutusuna bazı yapıların getirilmesine izin verir.

bazı örnekler :

// MARK:

-> öncesinde bir yatay bölücü bulunacaktır

// MARK: your text goes here

-> 'metniniz buraya gelir' seçeneğini açılır listeye kalın olarak yerleştirir

// MARK: - your text goes here

-> 'metniniz buraya gider' ifadesini, önce yatay bir bölücü ile açılan listeye kalın olarak yerleştirir

güncelleme: ekran görüntüsü eklendi 'bazı insanlar hala bununla ilgili sorunlar yaşıyor gibi görünüyor:

resim açıklamasını buraya girin


1
XCode 6.1.1'de // MARK: - textbenim için kullanılan ayırıcı yok ve açılır listede MARK: metin yerine metin gösteriliyor .
mostruash

Xcode 6.1.1'de benim için iyi çalışıyor, sadece bir ekran görüntüsü ekledim - lütfen kodunuzu kontrol edin?
Ronny Webers

Objective-C dosyaları için denediğimi söylemeyi unuttum. Yine de çaba için oy, teşekkür ederim.
mostruash

1
Anladım, şimdi açık :-) İlk soru Swift hakkında soruyor, bu yüzden bunu düşünmedim. Tamlık için: Objective-C'de aşağıdakileri kullanarak aynı işlemi yapabilirsiniz: #pragma mark - İşaret metniniz buraya veya sadece #pragma işaretine - bir çubuğa ihtiyacınız varsa veya #pragma mark İşaret metniniz buraya gelir bar olmadan. (üzgünüm, kod parçaları için biçimlendirmeyi doğru yapamıyorum, onları kalın olarak koydum)
Ronny Webers

Xcode 8.1'de biraz değişti, ancak bu kural genellikle çalışıyor, bu cevabı en iyi tercih edin: D
windsound

167

Uzantıları ve pragma işaretlerini (ilk yorumda belirtildiği gibi) kullanmak isteyenler için, bir Swift Mühendisinden nasıl uygulanacağı aşağıda açıklanmıştır:

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
    }

}

Ayrıca mutlaka en iyi uygulama değildir, ancak isterseniz bunu böyle yaparsınız.


6
Bu çok güzel, ancak uzantıların isimleri olsaydı iyi olurdu.
Matthew Knippen

16
@Matthew - Kullanabilirsin typealias. Örneğin typealias DataSource = SwiftTableViewController. Sonraextension Datasource {}
Logan

1
@PhongLe UITableViewControllerbir protokol değil, bir sınıftır. Muhtemelen demek istiyorsun UITableViewControllerDataSource, ama bu örnekte kullanılan desen değil.
KPM

4
Sadece neden extensionprotokol ile başlık var merak ediyorum , gibi extension SwiftTableViewController : UITableViewController, neden bu uzantıyı sınıfa eklediğiniz görmek için daha okunaklı olurdu.
holex

7
Uzantınızın bir protokol uygulaması gibi davranmaya yalnızca varsa bunu unutmayın edebilirsiniz uzantıyı isim: extension SwiftTableViewController : UITableViewDelegate { .. }veextension SwiftTableViewController : UITableViewDatasource { .. }
Craig Otis

117

Pragma mark - [SOME TEXT HERE]Objective-C'de birkaç işlevi birlikte gruplandırmak için kullanıldıHat-ayırarak .

In Swift kullanmakta bunu başarabilirsinizMARK, TODO OR FIXME

ben. İŞARET : //MARK: viewDidLoad

Bu, viewDidLoad altında gruplandırılmış işlevlerle yatay bir çizgi oluşturur (ekran görüntüsü 1'de gösterilir)

Ekran görüntüsü 1

ii. YAPMAK : //TODO: - viewDidLoad

Bu, işlevi YAPILACAKLAR altında gruplayacaktır : - viewDidLoad kategorisi (ekran görüntüsü 2'de gösterilmiştir)

Ekran görüntüsü 2

iii. DÜZELT BENİ : //FIXME - viewDidLoad

Bu, FIXME altında işlevi gruplandıracaktır : - viewDidLoad kategorisi (ekran görüntüsü 3'te gösterilmiştir)

Ekran görüntüsü 3

Ayrıntılar için bu elma belgelerine bakın.


TODO ve FIXME'den sonra "-" hiçbir şey yapmadığına dikkat edin. "-" yalnızca MARK yönergesi ile ilgilidir.
rismay

1
Ayrıca, kaynak dosyasının sağ tarafında gösterebileceğiniz "mini harita" kodunda büyük, büyük harfle yazılmış bir başlık başlığı oluşturur. Oldukça kullanışlı.
Oscar

66

Resmi Belgeler

Apple'ın Xcode Jump Bar ile ilgili resmi belgesi: Jump çubuğuna kod ek açıklamaları ekleyin

Örnek Kod için Jump Bar Ekran Görüntüleri

Basit kod

Xcode 10.1 ve macOS 10.14.3 (Mojave) 'de davranış

Xcode 10.1 ve macOS 10.14.3

Xcode 10.0 ve macOS 10.13.4 (Yüksek Sierra) davranışları

Xcode 10.0 ve macOS 10.13.4

Xcode 9.4.1 ve macOS 10.13.0'daki davranış

Xcode 9.4.1 ve macOS 10.13.0

Tartışma

!!!:ve ???:bazen görüntülenemez.


!!!: ve ???: sözdizimi Xcode 11.3.1 üzerinde çalışmıyor
Jayprakash Dubey

56

Objective-C kodu Xcode // MARK: - foobiraz daha taşınabilir gibi yorumlar algılar#pragma . Ama bunlar da henüz toplanmış gibi görünmüyor (henüz?).

Düzenleme: Xcode 6 beta 4'te düzeltildi.


6
Umarım yakında kullanılabilir hale getirirler, çünkü her şeyi pragma işaretleri ile organize tutmak isterim. <
Arbitur

1
Bunun // MARK: -şimdilik çalışmadığını onaylayabilirim .
Rui Peres

Çalışmıyor, ancak örnek kod bu yorum stiliyle doludur, bu yüzden sonunda alınmalıdır.
Nate Cook

1
taşınabilir olması önemli mi? çünkü bir Swift kodunu doğrudan başka bir dile taşımak geliştiriciler için zaten zordur.
holex

Hmmm, işe yaradığını söyleyen birçok insan görüyorum, ancak Beta 6'dayım ve // MARK:çalışmıyor gibi görünüyor. Ben boşluk ile ve olmadan, iki nokta üst üste ve iki nokta üst üste denedim ve karışık (Mark). Bir hile var mı? Bir pref veya başka bir şeyi etkinleştirmem gerekir mi?
Olie

37

Bence bunun Extensionsyerine daha iyi bir yol#pragma mark .

Kullanmadan önce Kod 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) {
        ...
    }
}

Kullandıktan sonra kod 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
Bence onun potansiyeli pragmastan çok daha fazla ama şu anda pragmalar hala daha iyi çünkü uzatma açılır menüde pragmalar gibi protokol isimlerini veya özel isimleri göstermiyor ( Whasssaaahhh'ın cevabının altına bakın )
nacho4d

Yeni "// MARK:" kodu kullanışlıdır, ancak uzantıların nasıl kullanılacağına dair açık bir örneğiniz de hoşuma gidiyor - özellikle delege işlevleri için!
ElmerCat

uzantıları da yapabileceklerinizi sınırlar - örneğin depolanmış mülk yoktur
Confused Vorlon

1
Her ikisini de kullanıyorum çünkü extensiontek başına Xcode'un kırıntı kontrolünün açılır menüsünde gerçekten göze çarpmıyor.
Nicolas Miari

36

Xcode 8 şimdi aşağıdaki gibi işliyor ve yöntem açılır penceresinde şu şekilde görünüyor:

resim açıklamasını buraya girin


MARK'a ne oldu? // ARK: Xcode 8'de benim gibi görünüyor
fnc12

Kodunuzu kontrol edin, // MARK: satırınızın üzerinde bazı unicode karakterler kullanıyor olabilirsiniz. Bazı nedenlerden dolayı xcode karışır (ve berbat olduğu için) ve bunun üstesinden gelemez.
carlos_ms

3
!!!Ve ???sözdizimi ... Xcode 8.3.3 üzerinde çalışıyor gibi görünmüyor
Chris Frederick

@ChrisFrederick Bile !!! ve ??? dosen't Xocde 11.3.1
Jayprakash Dubey

34

Şu anda WWDC'de Swift laboratuvarında bir Apple Mühendisi ile şu anda herhangi bir #pragma veya eşdeğeri olmadığını doğruladılar, bunu bir hata olarak görüyorlar ve yakında gelecek, bu yüzden beta 2'yi tahmin ediyorum, umarım.

Her neyse, yolda.


Xcode artık kodunuza açıklama eklemek ve atlama çubuğunda listelemek için // MARK :, // TODO: ve // ​​FIXME yer işaretlerini destekliyor


6
Beta 2, hala yok
cescofry

Garip. Benim için iyi çalışıyor. Not: X kodunuzu güncelleyin.
Daniel

@Daniel: Xcode'un hangi sürümü? Xcode 6.4 kullanıyorum ve üzerinde çalışmıyor gibi görünüyor.
Jayprakash Dubey

19

#pragma_markSwift'e eklemek için üç seçenek vardır :

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

Not: -Ayırıcı eklemek için kullanır


17

kullanım

// MARK: SectionName

veya

// MARK: - SectionName

Bu, pragma işaretinin üzerinde bir çizgi verecek ve daha okunabilir hale getirecektir.

Kolaylık için sadece ekleyin

// MARK: - <#label#>

kod snippet'lerinize.

Alternatif yol -

Bu şekilde kullanın

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

Bu sadece işaret eklemekle kalmayacak (pragma işareti gibi), aynı zamanda kodu da güzelce ayıracaktır.


1
Eğer kullanırsanız Swiftlint , bu şikayet edecek //MARKformatında (boşluk) ve önermek // MARK: (text)( bir boşluk arasına //ve MARK, hiçbir boşluk arasına MARKve :ve bir boşluk arasına :ve bölüm adını)
Nicolas Miari

2
@NicolasMiari, Teşekkürler, önerinizi göre düzenledim. Ayrıca bir sonraki proje için SwiftLint'i kullanmayı deneyecek. :)
Nikhil Manapure

13
//# MARK: - Spinner Class Methods

Bir ayırıcı çizgi eklemek için iki nokta üst üste ve açıklamanız arasına bir satır ekleyin. Bu, kodunuzu daha da düzenlemenize yardımcı olur. Yukarıdaki kod ve ekran görüntüsü, bir satır dahil MARK yorumundan yararlanır.

  1. // # MARK: - Metin Yöntemleri (LINE)
  2. // # MARK: Metin Yöntemleri (HAT YOK)

Bu sadece MARK yorumu ile çalışır.

resim açıklamasını buraya girin


12

Ayrıca ilginizi çekebilir Swift 4.2 / XCode 10 derleyici yönergeleri gibi

#warning("Some string to display")

ve

#error("Some error to display")

Gerçekten bir şey kaçırmak istemediğinizde yararlı olabilir.

resim açıklamasını buraya girin


Güzel. Çocuk izci kurallarını ihlal ettiğinde diğer takım arkadaşlarını uyaracağım.
Sazzad Hissain Han

9

Profesyonel programcı iyi etiket için bu etiketi kullanmalıdır. Ekip çalışması için de iyidir.

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

Bunun gibi bir yöntem bulmak kolaydır

Bunun gibi bir yöntem bulmak kolaydır


6

Xcode 11'de etkinleştirilebilen mini harita eklediler Editor -> Minimap.

Mini harita, kodda hızlı yönlendirme için her işaret metnini gösterecektir. Her işaret şöyle yazılır// MARK: Variables

resim açıklamasını buraya girin


5

//MARK:değil gibi görünüyor Xcode 6.3.2 benim için işe. Ancak, bu işe almak için yaptım :

1) Kod:

import Cocoa

class MainWindowController: NSWindowController {

    //MARK: - My cool methods

    func fly() {
    }

    func turnInvisible() {

    }
}

2) : Yorum jump bareklenirken hiçbir şey değişmez //MARK. Ancak, atlama çubuğundaki en sağdaki adı tıklarsam, benim durumumda MainWindowController(with a leading C icon), // MARK: yorumunun, yani "Benim serin yöntemlerim" yazan bir başlığın etkilerini gösteren bir açılır pencere görüntülenecektir:

resim açıklamasını buraya girin

3) Ayrıca, kodumdaki yöntemlerden birine tıklarsam, yöntemin atlama çubuğundaki en sağdaki giriş haline geldiğini fark ettim. Almak için MainWindowController(with a leading C icon)atlama çubuğunda en sağdaki giriş olması, benim yöntemlerle yukarıdaki boşluk tıklamanız gerekiyor.


Böyle olması gerekmiyor mu? Üstteki çubuğu tıklamanız gerektiğini mi?
Arbitur

3

Apple, Building Cocoa Apps'ın son sürümünde ,

Swift derleyicisi bir önişlemci içermez. Bunun yerine, aynı işlevselliği gerçekleştirmek için derleme zamanı özelliklerinden, derleme yapılandırmalarından ve dil özelliklerinden yararlanır. Bu nedenle, önişlemci yönergeleri Swift'e aktarılmaz.

# Karakteri hala çeşitli yapı yapılandırmaları ve bunun gibi şeylerle nasıl çalıştığınız gibi görünüyor, ancak pragma damarındaki çoğu ön işleme ihtiyacınızı azaltmaya ve sizi diğer dil özelliklerine iletmeye çalışıyor gibi görünüyor. Belki de bu, Oyun Alanlarının işleyişine ve REPL'nin tamamen derlenmiş koda mümkün olduğunca yakın davranmasına yardımcı olmaktır.


0

Yapılacaklar öğesi ekleme: TODO: önekiyle bir yorum ekleyin. Örneğin: // YAPILACAKLAR: [yapılacaklar öğeniz].

Hata düzeltme hatırlatıcısı ekleme: FIXME: önekiyle bir yorum ekleyin. Örneğin: // FIXME: [hata düzeltme hatırlatıcınız].

Başlık ekleyin: MARK: önekiyle bir yorum ekleyin. Örneğin: // MARK: [bölüm başlığınız].

Ayırıcı satır ekleme: Ek açıklamanın üstüne ayırıcı eklemek için ek açıklamanın yorum kısmından önce bir tire işareti (-) ekleyin. Örneğin: // MARK: - [içeriğiniz]. Bir notun altına ayırıcı eklemek için, notun yorum kısmından sonra bir tire işareti (-) ekleyin. Örneğin: // MARK: [içeriğiniz] -.


0

Bunu dene:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}

0

Pragma mark, kodunuzun okunabilirliğini artırmanın bir yoludur. Pragma yorumları Xcode jumpbar'daki etiketler gibi görünecektir.

//MARK:  <Your comment goes here>

Örnek: Kodda,

//MARK: Properties

// MARK: View Life cycle

//MARK: Helper methods

Xcode atlama çubuğunda böyle görünecektir.

resim açıklamasını buraya girin


Bunları dosyanızdaki doğru yerlere eklemeniz yeterlidir.
varunrathi28
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.