스위프트의 #pragma 마크?


936

Objective C에서는 #pragma mark심볼 탐색기에서 코드 섹션을 표시 하는 데 사용할 수 있습니다 . 이 명령은 C 전 처리기 명령이므로 Swift에서는 사용할 수 없습니다. Swift에 이것에 대한 스탠드 인이 있습니까, 아니면 추악한 주석을 사용해야합니까?


15
긴 코드를 구성하는 것이 정말 중요합니다.
iPatel

주석과 섹션 표시 사이에 더 이상 눈에 띄는 차이가없는 것으로 보입니다. 확장자는 이름이 지정되지 않으므로 별도의 파일이 두 가지 유형의 주석을 구분할 수있는 유일한 방법 인 것 같습니다
Stephen J

1
이것을 확인할 수 있습니다 : stackoverflow.com/a/33040068/1753005
Jayprakash Dubey

1
다른 Swift 및 Xcode 초보자의 경우 모든 사람이 말하는 "기호 탐색기"는 편집 창의 맨 위에있는 "점프 바"에서 가장 오른쪽에있는 것을 클릭하면 얻을 수있는 것입니다. 왼쪽 패널의 심볼 탐색기가 아닙니다.
RenniePet

1
@HarshilKotecha Swift는 실행되는 플랫폼과 독립적 인 프로그래밍 언어입니다. Pragma 마크는 Swift의 일부이며 Linux, macOS 및 iOS를 포함한 기타 Apple 플랫폼에서 사용할 수 있습니다. pragma 마크는 플랫폼이 아닌 Swift 자체의 기능이므로이 플랫폼에이 질문에 태그를 붙이는 것은 우스운 일입니다. iOS는 Swift가 실행되는 많은 플랫폼 중 하나 일뿐입니다. 이해하는 것이 중요합니다. 이 질문은 iOS에 관한 것이 아니며 Linux 또는 macOS에 관한 것도 아닙니다. 스위프트에 관한 것입니다.
Eric Aya

답변:


1202

당신이 사용할 수있는 // MARK:


어쨌든 클래스 확장을 자유롭게 사용하는 것이 더 나은 방법 일 수도 있다는 논의가있었습니다. 확장은 프로토콜을 구현할 수 있으므로 모든 테이블 뷰 대리자 메서드를 확장에 넣고 코드를 #pragma mark가능한 의미보다 더 의미있는 수준으로 그룹화 할 수 있습니다.


64
그리고 네, 새로운 개발자 계약 : 우리가이 물건에 대해 이야기 할 수 있습니다
프랭크 슈미트

4
NSCoding과 같은 init 메소드가있는 프로토콜을 보유하기 위해 확장을 사용할 수 없습니다. 모든 경우에 사용할 수없는 경우 분리하기가 어렵습니다.
Matthew Knippen 2018 년

149
베타 4로, 엑스 코드 (6)는 인식 // MARK:, // TODO:그리고 // FIXME점프 줄에 스위프트 소스 및 목록을합니다. (BTW, 그것은 이미 (Obj) C 소스에서 수행되었습니다- #pragma mark유일한 방법은 아닙니다.) 그리고 그래도 메뉴에 구분 기호를 추가 -하기 위해 추가 할 수 있습니다 MARK.
rickster

17
확장 프로그램 추천에 +1 MARK지금 작업 하더라도 확장을 사용하여 의미 적으로 관련된 일부 코드 (특히 프로토콜 구현)를 그룹화하는 것이 여전히 유용 할 수 있습니다. IMHO 그것은 파일의 상단에 5 개의 프로토콜 선언과 50 개의 관련 메소드 구현이 아래 어딘가에 흩어져 있지 않고 그것을 구현하는 메소드 옆에 프로토콜 준수 선언을 훨씬 잘 읽습니다.
rickster

37
@StevenKramer :와 같은 방식으로 #pragma mark. // MARK: -는 구분자 일 뿐이며 // MARK: - stuff구분자와 헤더를 // MARK: - stuff -제공하며 한 줄에 구분자, 헤더 및 다른 구분자를 모두 제공합니다.
rickster

174

전 처리기 지시문 #pragma mark이 Xcode 5 까지 존재했습니다.

Xcode 6부터는 // MARK:

이러한 전 처리기 기능을 통해 소스 코드 편집기의 기능 드롭 다운 상자에 일부 구조를 가져올 수 있습니다.

몇 가지 예 :

// MARK:

-> 앞에 가로 구분선이 붙습니다.

// MARK: your text goes here

-> 드롭 다운 목록에 '텍스트가 여기에옵니다'를 굵게 표시합니다.

// MARK: - your text goes here

-> 드롭 다운 목록에 굵은 글씨로 '텍스트가 여기에옵니다'를 넣고 가로 구분선이옵니다.

업데이트 : 일부 사람들이 여전히 문제가있는 것 같아서 스크린 샷을 추가했습니다.

여기에 이미지 설명을 입력하십시오


1
엑스 코드 6.1.1에는 구분은 사용하지 있습니다 // MARK: - text나를 위해 및 목록 쇼의 드롭 다운 텍스트 : MARK를 대신의 텍스트를 .
mostruash

Xcode 6.1.1에서 제대로 작동합니다. 방금 스크린 샷을 추가했습니다. 코드로 확인하십시오?
Ronny Webers

Objective-C 파일에서 시도했다는 것을 언급하지 않았습니다. 노력에 투표, 감사합니다.
mostruash

1
나는 지금 분명하다 :-) 초기 질문은 스위프트에 대해 묻기 때문에 나는 그것을 생각하지 않았다. 완전성의 경우 : 목표 - C에서 당신은 사용하여 동일한 작업을 수행 할 수 의 #pragma 마크 - 당신의 마커 텍스트가 간다 , 또는 단지 의 #pragma 마크 - 당신이 줄 필요하거나 경우에 귀하의 마커 텍스트를 표시의 #pragma은 간다 같은를 얻을 수 바없이. (죄송합니다, 제가 코드 조각에 대한 올바른 마크 업을 얻을 수 없다, 나는 굵은 글씨로 넣어 한)
로니 웨버

Xcode 8.1에서 약간 변경되었지만이 규칙은 일반적으로 작동합니다.이 답변을 가장 선호합니다 : D
windsound

167

확장 기능과 pragma 마크 (첫 번째 주석에서 언급)를 사용하는 데 관심이있는 사용자를 위해 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
이것은 매우 멋지지만 확장명이 이름을 가질 수 있다면 좋을 것입니다.
Matthew Knippen

16
@Matthew-사용할 수 있습니다 typealias. 예를 들면 typealias DataSource = SwiftTableViewController. 그때extension Datasource {}
로건

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: - viewDidLoad

TODO에서 기능을 그룹화합니다 :-viewDidLoad 카테고리 (스크린 샷 2에 표시)

스크린 샷 2

iii. 나를 해결 : //FIXME - viewDidLoad

FIXME에서 기능을 그룹화합니다 :-viewDidLoad 카테고리 (스크린 샷 3에 표시)

스크린 샷 3

자세한 내용은 이 사과 설명서 를 확인 하십시오.


TODO 및 FIXME 뒤의 "-"는 아무 작업도 수행하지 않습니다. "-"는 MARK 지시문에만 관련됩니다.
rismay

1
또한 소스 파일의 오른쪽을 따라 표시 할 수있는 코드 "미니 맵"에 대문자로 된 큰 섹션 제목을 만듭니다. 꽤 편리합니다.
오스카

65

공식 문서

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 코드에서 Xcode는 // MARK: - foo보다 약간 이식하기 쉬운 주석을 감지 #pragma합니다. 그러나 이것들도 픽업되지 않은 것 같습니다 (아직?).

편집 : Xcode 6 베타 4에서 수정되었습니다.


6
나는 pragma 마크로 모든 것을 조직적으로 유지하고 싶어하기 때문에 그들이 곧 그것을 사용할 수 있기를 바랍니다.>. <
Arbitur

1
// MARK: -현재 작동하지 않는 것을 확인할 수 있습니다 .
Rui Peres

작동하지 않지만 샘플 코드는 해당 스타일의 주석으로 처리되므로 결국 선택해야합니다.
Nate Cook

1
의견이 이식성이 있어야 하는가? Swift 코드를 다른 언어로 직접 포팅하는 것은 이미 개발자에게 어려운 문제 이기 때문 입니다.
holex

흠, 많은 사람들이 그것이 효과가 있다고 언급하는 것을 보았지만 베타 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
나는 그 잠재력이 pragma보다 훨씬 크다고 생각하지만, pragma처럼 확장 기능이 드롭 다운 메뉴에 프로토콜 이름이나 사용자 정의 이름을 표시하지 않기 때문에 pragma는 여전히 낫습니다 ( Whasssaaahhh의 답변 아래 참조 )
nacho4d

새로운 "// MARK :"코드는 유용하지만 확장 기능을 사용하는 방법, 특히 델리게이트 함수에 대한 명확한 예를 좋아합니다!
ElmerCat

확장은 또한 당신이 무엇을 할 수 제한 - 아니 저장된 속성을 예
볼론 혼란

1
extensionXcode의 이동 경로 제어의 드롭 다운 메뉴에서 단독으로 눈에 띄지 않기 때문에 둘 다 사용합니다 .
Nicolas Miari

36

Xcode 8은 이제 다음과 같이 처리하고 메소드 드롭 다운에 다음과 같이 나타납니다.

여기에 이미지 설명을 입력하십시오


마크는 어떻습니까? 그것은 // ARK: Xcode 8에서 나와 비슷 합니다
fnc12

코드를 확인하십시오. // MARK : 줄 위에 유니 코드 문자를 사용하고있을 수 있습니다. 어떤 이유로 xcode는 혼란스럽고 (빨리 빠지기 때문에) 처리 할 수 ​​없습니다.
carlos_ms

3
!!!???구문은 ... 엑스 코드 8.3.3에 작동하는 표시되지 않습니다
크리스 프레드릭에게

@ChrisFrederick 짝수 !!! 그리고 ??? 나던은 Xocde 11.3.1에 작동하는 것 같군
Jayprakash Dubey

34

WWDC에서 오늘 아침 Swift 연구소의 Apple 엔지니어와 함께 현재 #pragma 또는 이와 동등한 것이 없음을 확인했으며, 버그로 간주하고 곧 도착할 것이므로 베타 2를 추측하고 싶습니다.

어쨌든, 그것은 길에 있습니다.


Xcode는 이제 // MARK :, // TODO : 및 // FIXME 랜드 마크를 지원하여 코드에 주석을 달고 점프 막대에 나열합니다.


6
베타 2, 아직 없습니다
cescofry

이상한. 나를 위해 잘 작동합니다. 추신 : Xcode를 업데이트하십시오.
Daniel

@Daniel : Xcode의 어느 버전입니까? Xcode 6.4를 사용하고 있으며 작동하지 않는 것 같습니다.
Jayprakash Dubey

19

#pragma_markSwift 에 추가 할 수 있는 세 가지 옵션이 있습니다 .

1) // MARK: - your text here -

2) // TODO: - your text here -

삼) // FIXME: - your text here -

참고 : -구분 기호 추가에 사용


17

사용하다

// MARK: SectionName

또는

// MARK: - SectionName

이것은 pragma 마크 위에 줄을 표시하여 더 읽기 쉽게 만듭니다.

쉽게 추가하기 위해

// MARK: - <#label#>

코드 스 니펫에.

다른 방법-

이런 식으로 사용하십시오

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

이것은 pragma 마크와 같은 마크를 추가 할뿐만 아니라 코드를 멋지게 분리합니다.


1
당신이 사용하는 경우 Swiftlint를 , 그것은 대해 불평 //MARK형식 (공백없이) 및 제안 // MARK: (text)( 한 칸 사이 //와 MARK, 공백없이 사이 MARK:, 그리고 하나 개의 공간 사이 :와 섹션 이름)
니콜라스 미아리

2
@NicolasMiari, 감사합니다. 귀하의 제안에 따라 편집했습니다. 또한 다음 프로젝트에 SwiftLint를 사용해보십시오. :)
Nikhil Manapure

13
//# MARK: - Spinner Class Methods

콜론과 설명 사이에 줄을 추가하여 구분선을 삽입하십시오. 이를 통해 코드를 더욱 체계적으로 구성 할 수 있습니다. 위의 코드와 스크린 샷은 라인이 포함 된 MARK 주석을 사용합니다.

  1. // # MARK : – 텍스트 방법 (LINE)
  2. // # MARK : 텍스트 방법 (라인 없음)

이것은 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 : 주석의 효과, 즉 "나의 멋진 방법"이라는 제목을 나타내는 팝업 창이 표시됩니다.

여기에 이미지 설명을 입력하십시오

3) 또한 코드에서 메소드 중 하나를 클릭하면 메소드가 점프 막대에서 가장 오른쪽에있는 항목이됩니다. MainWindowController(with a leading C icon)점프 막대에서 가장 오른쪽 에 들어가려면 메서드 위의 공백을 클릭해야합니다.


그게 어떻습니까? 상단 바를 클릭해야합니까?
Arbitur

3

Apple은 최신 버전의 Building Cocoa Apps 에서

Swift 컴파일러에는 전처리 기가 포함되어 있지 않습니다. 대신 컴파일 타임 속성, 빌드 구성 및 언어 기능을 활용하여 동일한 기능을 수행합니다. 이러한 이유로 전 처리기 지시문은 Swift에서 가져 오지 않습니다.

# 문자는 여전히 다양한 빌드 구성 및 이와 유사한 작업을 수행하는 방식으로 보이지만 pragma의 맥락에서 대부분의 전처리에 대한 필요성을 줄이고 다른 언어 기능으로 전달하려고하는 것처럼 보입니다. 아마도 이것은 완전히 컴파일 된 코드에 최대한 가깝게 동작하는 놀이터와 REPL의 작동을 돕기위한 것입니다.


0

해야할 일 항목 추가 : 접두사 TODO :로 주석을 삽입하십시오. 예를 들면 다음과 같습니다. // TODO : [your to-do item].

버그 수정 알림 추가 : 접두사 FIXME :로 주석을 삽입하십시오. 예 : // FIXME : [버그 수정 알림].

제목 추가 : 접두사 MARK :로 주석을 삽입하십시오. 예를 들면 다음과 같습니다. // MARK : [귀하의 섹션 제목].

구분선 추가 : 주석 위에 구분자를 추가하려면 주석의 주석 부분 앞에 하이픈 (-)을 추가하십시오. 예를 들면 다음과 같습니다. // MARK :-[콘텐츠]. 주석 아래에 구분 기호를 추가하려면 주석의 주석 부분 뒤에 하이픈 (-)을 추가하십시오. 예를 들면 다음과 같습니다. // MARK : [콘텐츠]-.



0

Pragma 마크는 코드의 가독성을 향상시키는 방법입니다. pragma 주석은 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.