#pragma mark w Swift?

936

W celu C mogę używać #pragma markdo zaznaczania części mojego kodu w nawigatorze symboli. Ponieważ jest to polecenie preprocesora języka C, nie jest ono dostępne w Swift. Czy w Swift jest na to jakieś rozwiązanie, czy też muszę używać brzydkich komentarzy?

Arbitraż
źródło
15
To bardzo ważne, aby uporządkować nasz długi kod.
iPatel
Wygląda na to, że nie ma już widocznej różnicy między komentarzami a oznaczeniami sekcji. Rozszerzenia nie są nazwane, więc oddzielne pliki wydają się być jedynym sposobem na rozgraniczenie dwóch rodzajów komentarzy
Stephen J
1
Możesz to sprawdzić: stackoverflow.com/a/33040068/1753005
Jayprakash Dubey,
1
W przypadku innych początkujących użytkowników Swift i Xcode wspomnę tylko, że „nawigator symboli”, o którym wszyscy mówią, to taki, który można uzyskać, klikając prawą rzecz na „pasku skoku” u góry okna edycji. To nie jest nawigator symboli na lewym panelu.
RenniePet
1
@HarshilKotecha Swift to język programowania niezależny od platformy, na której działa. Znak Pragma jest częścią Swift i może być używany na systemach Linux, macOS i innych platformach Apple, w tym iOS. Niedorzeczne byłoby oznaczenie tego pytania dowolną z tych platform, ponieważ znak pragma jest cechą samego Swift, a nie platformy. iOS to tylko jedna z wielu platform, na których działa Swift. To ważne, aby zrozumieć. To pytanie nie dotyczy iOS, ani Linuksa ani macOS. Chodzi o Swift.
Eric Aya,

Odpowiedzi:

1202

Możesz użyć // MARK:


Dyskutowano również, że swobodne stosowanie rozszerzeń klas może być lepszą praktyką. Ponieważ rozszerzenia mogą implementować protokoły, możesz np. Umieścić wszystkie metody delegowania widoku tabeli w rozszerzeniu i pogrupować kod na poziomie bardziej semantycznym niż #pragma markjest to możliwe.

Frank Schmitt
źródło
64
I tak, nowa umowa deweloperska pozwala nam rozmawiać o tych sprawach :)
Frank Schmitt
4
Nie można używać rozszerzeń do przechowywania protokołu z metodą inicjującą, takiego jak NSCoding. Utrudnia to oddzielenie, jeśli nie można go użyć we wszystkich przypadkach.
Matthew Knippen
149
Jako beta 4, Xcode 6 rozpoznaje // MARK:, // TODO:a // FIXMEw źródle Swift i wyświetla je w barze skoku. (BTW, już to zrobiłem w źródle (Obj) C - #pragma markto nie jedyny sposób.) I tak, nadal możesz dodać -do swojego, MARKaby wstawić separatory w menu.
rickster
17
+1 za polecanie rozszerzeń. Nawet przy MARKpracy teraz używanie rozszerzeń do grupowania niektórych rodzajów kodu semantycznego (szczególnie implementacji protokołu) może być nadal przydatne. IMHO znacznie lepiej odczytuje deklarację zgodności protokołu tuż obok metod, które ją implementują, a nie 5 deklaracji protokołu na górze pliku i 50 implementacji powiązanych metod losowo rozrzuconych gdzieś poniżej.
rickster
37
@StevenKramer: Tak samo jak z #pragma mark. // MARK: -jest tylko separatorem, // MARK: - stuffdaje separator i nagłówek oraz // MARK: - stuff -daje separator, nagłówek i inny separator w jednym wierszu komentarza.
rickster
174

Do Xcode 5 #pragma markistniała dyrektywa preprocesora .

Od Xcode 6 musisz korzystać // MARK:

Te funkcje preprocesora pozwalają wprowadzić pewną strukturę do pola rozwijanego funkcji edytora kodu źródłowego.

kilka przykładów :

// MARK:

-> będzie poprzedzony dzielnikiem poziomym

// MARK: your text goes here

-> umieszcza „Twój tekst idzie tutaj” pogrubioną czcionką na liście rozwijanej

// MARK: - your text goes here

-> umieszcza „Twój tekst idzie tutaj” pogrubioną czcionką na liście rozwijanej, poprzedzoną poziomym dzielnikiem

aktualizacja: dodano zrzut ekranu, ponieważ niektóre osoby nadal wydają się mieć z tym problemy:

wprowadź opis zdjęcia tutaj

Ronny Webers
źródło
1
W XCode 6.1.1 nie ma żadnych separatorów, // MARK: - texta rozwijana lista pokazuje MARK: tekst zamiast tylko tekstu .
mostruash
działa dobrze dla mnie w Xcode 6.1.1, właśnie dodałem zrzut ekranu - sprawdź swój kod?
Ronny Webers
Zapomniałem wspomnieć, że wypróbowałem to dla plików Objective-C. Głosuję za wysiłek, dziękuję.
mostruash
1
Rozumiem, teraz jest jasne :-) Początkowe pytanie dotyczy Swift, więc nie pomyślałem o tym. Dla kompletności: w Objective-C możesz zrobić to samo, używając: # znak znacznika - tutaj jest twój tekst znacznika , lub po prostu # znak znacznika - jeśli potrzebujesz paska, lub # znaczka tekstu twój znacznik idzie tutaj, aby uzyskać to samo bez paska. (przepraszam, nie mogę ustawić poprawności znaczników dla fragmentów kodu, pogrubiłem je)
Ronny Webers
To trochę zmieniło się w Xcode 8.1, ale ta reguła ogólnie działa, wolę tę odpowiedź najlepiej: D
windsound
167

Dla tych, którzy są zainteresowani użyciem rozszerzeń kontra znaczniki pragma (jak wspomniano w pierwszym komentarzu), oto jak zaimplementować je od inżyniera 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
    }

}

To niekoniecznie najlepsza praktyka, ale tak to robisz, jeśli chcesz.

NatashaTheRobot
źródło
6
To bardzo fajne, ale byłoby miło, gdyby rozszerzenia mogły mieć nazwy.
Matthew Knippen
16
@Matthew - Możesz użyć typealias. Na przykład typealias DataSource = SwiftTableViewController. Następnieextension Datasource {}
Logan
1
@PhongLe UITableViewControllerto nie protokół, to klasa. Prawdopodobnie masz na myśli UITableViewControllerDataSource, ale nie jest to wzorzec użyty w tym przykładzie.
KPM
4
Zastanawiam się tylko, dlaczego extensionnagłówek nie ma protokołu, na przykład extension SwiftTableViewController : UITableViewControllerbardziej zrozumiałe byłoby, dlaczego dodałeś to rozszerzenie do klasy.
holex,
7
Zauważ, że jeśli rozszerzenie istnieje wyłącznie w celu działania jako implementacji protokołu, to można nazwać rozszerzenie: extension SwiftTableViewController : UITableViewDelegate { .. }aextension SwiftTableViewController : UITableViewDatasource { .. }
Craig Otis
117

Pragma mark - [SOME TEXT HERE]został użyty w celu C do zgrupowania kilku funkcji razem poprzez rozdzielenie linii.

W Swift możesz to osiągnąć za pomocąMARK, TODO OR FIXME

ja. ZNAK : //MARK: viewDidLoad

Spowoduje to utworzenie poziomej linii z funkcjami zgrupowanymi pod viewDidLoad (pokazane na zrzucie ekranu 1)

Zrzut ekranu 1

ii. DO ZROBIENIA : //TODO: - viewDidLoad

Spowoduje to zgrupowanie funkcji w ramach TODO: - kategoria viewDidLoad (pokazana na zrzucie ekranu 2)

Zrzut ekranu 2

iii. NAPRAW MNIE : //FIXME - viewDidLoad

Spowoduje to zgrupowanie funkcji w ramach FIXME: - kategoria viewDidLoad (pokazana na zrzucie ekranu 3)

Zrzut ekranu 3

Sprawdź szczegóły w dokumentacji Apple .

Jayprakash Dubey
źródło
Zauważ, że „-” po TODO i FIXME nic nie robią. „-” dotyczy tylko dyrektywy MARK.
rismay
1
Tworzy również duży, pisany wielkimi literami rozdział w „minimapie” kodu, który można wyświetlić wzdłuż prawej strony pliku źródłowego. Bardzo przydatny.
Oscar
65

Oficjalna dokumentacja

Oficjalny dokument Apple dotyczący paska skoku Xcode: dodaj adnotacje do kodu paska skoku

Zrzuty ekranowe paska skoku dla przykładowego kodu

Przykładowy kod

Zachowanie w Xcode 10.1 i macOS 10.14.3 (Mojave)

Xcode 10.1 i macOS 10.14.3

Zachowanie w Xcode 10.0 i macOS 10.13.4 (High Sierra)

Xcode 10.0 i macOS 10.13.4

Zachowanie w Xcode 9.4.1 i macOS 10.13.0

Xcode 9.4.1 i macOS 10.13.0

Dyskusja

!!!:i ???:czasami nie mogą być wyświetlane.

Jerzy
źródło
!!!: i ???: składnia nie działa na Xcode 11.3.1
Jayprakash Dubey
56

W kodzie Objective-C Xcode wykrywa komentarze takie, // MARK: - fooktóre są nieco bardziej przenośne niż #pragma. Ale te też nie wydają się być (jeszcze?) Odebrane.

Edycja: Naprawiono w Xcode 6 beta 4.

Nikolai Ruhe
źródło
6
Mam nadzieję, że wkrótce ją udostępnią, ponieważ lubię organizować wszystko za pomocą znaków pragma>. <
Arbitur
1
Mogę potwierdzić, że // MARK: -w tej chwili nie działa.
Rui Peres,
Nie działa, ale przykładowy kod jest zaśmiecony tym stylem komentarza, więc w końcu należy go pobrać.
Nate Cook
1
czy ważne jest, aby komentarz był przenośny? ponieważ bezpośrednie przeniesienie kodu Swift na inny język jest już wyzwaniem dla programistów.
holex
Hmmm, widzę wiele osób komentujących, że to działa, ale jestem na Beta 6 i // MARK:wydaje się, że nie działa. Próbowałem z i bez spacji, z dwukropkiem i bez, all-caps i mix (Mark). Czy jest jakiś podstęp? Czy muszę aktywować pref czy coś?
Olie,
37

Myślę, że Extensionsjest lepszy sposób niż #pragma mark.

Kod przed użyciem 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) {
        ...
    }
}

Kod po użyciu 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) {
       ...
    }
}
jqgsninimo
źródło
6
Myślę, że jego potencjał jest czymś więcej niż pragmami, ale w tej chwili pragmy są jeszcze lepsze, ponieważ rozszerzenia nie pokazują nazw protokołów ani nazw niestandardowych w rozwijanym menu, tak jak pragmy ( patrz poniżej odpowiedź
Whasssaaahhha
Nowy kod „// MARK:” jest przydatny, ale podoba mi się również twój jasny przykład użycia rozszerzeń - szczególnie w przypadku funkcji delegowania!
ElmerCat
rozszerzenia ograniczają również to, co możesz zrobić - np. brak przechowywanych właściwości
Zmieszany Vorlon
1
Używam obu, ponieważ extensionsam ten tak naprawdę nie wyróżnia się w menu rozwijanym kontroli okruszków Xcode.
Nicolas Miari
36

Xcode 8 obsługuje teraz go w następujący sposób i pokazuje się tak w menu rozwijanym metody:

wprowadź opis zdjęcia tutaj

Antoine
źródło
co z MARK:? Pokazuje jak // ARK: dla mnie w Xcode 8
fnc12
Sprawdź swój kod, być może używasz znaków unicode powyżej linii // MARK:. Z jakiegoś powodu xcode się myli (i dlatego, że jest do bani) i nie może sobie z tym poradzić.
carlos_ms
3
!!!I ???składnia nie wydaje się działać na Xcode 8.3.3 ...
Chris Frederick
@ChrisFrederick Even !!! i ??? wydaje się, że nie działa na Xocde 11.3.1
Jayprakash Dubey
34

Potwierdzony dziś rano przez inżyniera Apple w laboratorium Swift w WWDC, że obecnie nie ma #pragmy lub jej odpowiednika, uważają to za błąd i niedługo nadejdzie, więc mam nadzieję, że beta 2.

W każdym razie jest już w drodze.


Xcode obsługuje teraz punkty orientacyjne // MARK :, // TODO: i // FIXME, aby opisywać kod i wyświetlać je na pasku skoku

Daniel
źródło
6
Beta 2, jeszcze go nie ma
cescofry
Dziwne. Działa dla mnie dobrze. PS: zaktualizuj swój Xcode.
Daniel
@Daniel: Która wersja Xcode? Używam Xcode 6.4 i wydaje się, że nie działa.
Jayprakash Dubey,
19

Istnieją trzy opcje do dodania #pragma_markw Swift:

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

Uwaga: Zastosowania -do dodawania separatorów

Jaydip
źródło
17

Posługiwać się

// MARK: SectionName

lub

// MARK: - SectionName

To da linię powyżej znaku pragma, dzięki czemu będzie bardziej czytelna.

Dla ułatwienia wystarczy dodać

// MARK: - <#label#>

do fragmentów kodu.

Alternatywny sposób -

Użyj tego w ten sposób

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

To nie tylko doda znak (podobnie jak znak pragma), ale także ładnie segreguje kod.

Nikhil Manapure
źródło
1
Jeśli użyjesz Swiftlint , narzeka on na //MARKformat (bez spacji) i sugeruje // MARK: (text)( jedna spacja między //i MARK, brak spacji między MARKi :oraz jedna spacja między :nazwą sekcji)
Nicolas Miari
2
@NicolasMiari, Dzięki, edytowałem zgodnie z twoją sugestią. Spróbuje również użyć SwiftLint do następnego projektu. :)
Nikhil Manapure
13
//# MARK: - Spinner Class Methods

Dodaj linię między dwukropkiem a opisem, aby wstawić linię separatora. Pomaga to jeszcze bardziej uporządkować kod. Powyższy kod i zrzut ekranu wykorzystują komentarz MARK z dołączoną linią.

  1. // # MARK: - Metody tekstowe (LINIA)
  2. // # MARK: Metody tekstowe (NO LINE)

Działa to tylko z komentarzem MARK.

wprowadź opis zdjęcia tutaj

aashish tamsya
źródło
12

Możesz być także zainteresowany dyrektywami kompilatora Swift 4.2 / XCode 10, takimi jak

#warning("Some string to display")

i

#error("Some error to display")

Może to być przydatne, gdy naprawdę nie chcesz czegoś przegapić.

wprowadź opis zdjęcia tutaj

kilka linii kodu
źródło
Fajne. Ostrzegam innych członków drużyny, gdy zwiadowca, który naruszył zasadę, będzie kontynuował.
Sazzad Hissain Khan
9

Profesjonalny programista musi używać tego znacznika, aby uzyskać dobry kod. Jest również dobry do pracy zespołowej.

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

Łatwo jest znaleźć taką metodę

Łatwo jest znaleźć taką metodę

Harshil Kotecha
źródło
6

W Xcode 11 dodali minimapę, którą można aktywować Editor -> Minimap.

Minimapa pokaże każdy znak tekstu w celu szybkiej orientacji w kodzie. Każdy znak jest napisany jak// MARK: Variables

wprowadź opis zdjęcia tutaj

Marek Baláž
źródło
5

//MARK:nie wydaje mi się działać w Xcode 6.3.2. Jednak tak zrobiłem , aby działało :

1) Kod:

import Cocoa

class MainWindowController: NSWindowController {

    //MARK: - My cool methods

    func fly() {
    }

    func turnInvisible() {

    }
}

2) W jump barnic nie wydaje się zmieniać podczas dodawania //MARK: komentarza. Jeśli jednak kliknę prawą nazwę na pasku skoku, w moim przypadku jest to napisane MainWindowController(with a leading C icon), pojawi się wyskakujące okienko pokazujące efekty komentarza // MARK: komentarz, a mianowicie nagłówek z napisem „Moje fajne metody”:

wprowadź opis zdjęcia tutaj

3) Zauważam również, że jeśli kliknę jedną z metod w moim kodzie, metoda ta stanie się pozycją umieszczoną najbardziej na prawo na pasku skoku. Aby uzyskać MainWindowController(with a leading C icon)pozycję najbardziej na prawo na pasku skoku, muszę kliknąć biały znak nad moimi metodami.

7stud
źródło
Czy tak nie powinno być? Że musisz kliknąć górny pasek?
Arbitur
3

Apple stwierdza w najnowszej wersji Building Cocoa Apps ,

Kompilator Swift nie zawiera preprocesora. Zamiast tego wykorzystuje atrybuty czasu kompilacji, konfiguracje kompilacji i funkcje językowe, aby osiągnąć tę samą funkcjonalność. Z tego powodu dyrektywy preprocesora nie są importowane do Swift.

Wygląda na to, że znak # wciąż działa z różnymi konfiguracjami kompilacji i podobnymi rzeczami, ale wygląda na to, że starają się zmniejszyć potrzebę większości przygotowań wstępnych w stylu pragmy i przekazać ci inne funkcje językowe. Być może ma to pomóc w działaniu Playgrounds, a REPL zachowuje się jak najbliżej w pełni skompilowanego kodu.

UtopiaLtd
źródło
0

Dodaj rzecz do zrobienia: wstaw komentarz z przedrostkiem TODO :. Na przykład: // TODO: [Twoja rzecz do zrobienia].

Dodaj przypomnienie o błędzie: Wstaw komentarz z prefiksem FIXME :. Na przykład: // FIXME: [przypomnienie o błędzie].

Dodaj nagłówek: Wstaw komentarz z prefiksem ZNAK :. Na przykład: // MARK: [nagłówek twojej sekcji].

Dodaj linię separatora: Aby dodać separator powyżej adnotacji, dodaj myślnik (-) przed częścią komentarza adnotacji. Na przykład: // MARK: - [twoja treść]. Aby dodać separator pod adnotacją, dodaj myślnik (-) po części komentarza adnotacji. Na przykład: // MARK: [twoja treść] -.

Dzierżawa
źródło
0

Spróbuj tego:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}
Nirbhay Singh
źródło
0

Znak Pragma to sposób na poprawę czytelności kodu. Komentarze pragma wyglądałyby jak tagi na pasku skoku Xcode.

//MARK:  <Your comment goes here>

Przykład: w kodzie

//MARK: Properties

// MARK: View Life cycle

//MARK: Helper methods

Tak to wyglądałoby na pasku skoku Xcode.

wprowadź opis zdjęcia tutaj

varunrathi28
źródło
Musisz tylko wstawić je w odpowiednie miejsca w swoim pliku.
varunrathi28