#pragma đánh dấu trong Swift?


936

Trong Mục tiêu C, tôi có thể sử dụng #pragma markđể đánh dấu các phần trong mã của mình trong bộ điều hướng biểu tượng. Vì đây là lệnh tiền xử lý C, nên nó không có sẵn trong Swift. Có một điểm nhấn cho điều này trong Swift, hay tôi phải sử dụng những bình luận xấu xí?


15
Nó thực sự quan trọng để tổ chức mã dài của chúng tôi.
iPatel

Dường như không còn sự khác biệt có thể nhìn thấy nhanh chóng giữa các bình luận và đánh dấu phần. Phần mở rộng không được đặt tên, vì vậy các tệp riêng biệt dường như là cách duy nhất để phân định giữa hai loại nhận xét
Stephen J

1
Bạn có thể kiểm tra cái này: stackoverflow.com/a/33040068/1753005
Jayprakash Dubey

1
Đối với những người mới sử dụng Swift và Xcode khác, tôi sẽ chỉ đề cập đến "trình điều hướng biểu tượng" mà mọi người đang nói đến là thứ bạn nhận được khi nhấp vào thứ ngoài cùng bên phải trong "thanh nhảy" ở đầu cửa sổ chỉnh sửa. Nó không phải là hoa tiêu biểu tượng trong bảng điều khiển bên trái.
RenniePet

1
@HarshilKotecha Swift là ngôn ngữ lập trình độc lập với nền tảng mà nó chạy. Dấu hiệu thực dụng là một phần của Swift và có thể được sử dụng trên Linux, macOS và các nền tảng khác của Apple bao gồm iOS. Sẽ thật nực cười khi gắn thẻ câu hỏi này với bất kỳ nền tảng nào trong số này vì dấu pragma là một tính năng của chính Swift, không phải của nền tảng. iOS chỉ là một trong nhiều nền tảng mà Swift chạy. Điều này là quan trọng để hiểu. Câu hỏi này không phải về iOS và cũng không phải về Linux hay macOS. Đó là về Swift.
Eric Aya

Câu trả lời:


1202

Bạn có thể dùng // MARK:


Cũng đã có cuộc thảo luận rằng việc sử dụng tự do các phần mở rộng lớp có thể là một cách thực hành tốt hơn. Vì các tiện ích mở rộng có thể thực hiện các giao thức, ví dụ, bạn có thể đặt tất cả các phương thức ủy nhiệm trong chế độ xem bảng của mình vào một tiện ích mở rộng và nhóm mã của bạn ở mức ngữ nghĩa nhiều hơn #pragma markkhả năng.


64
Và vâng, thỏa thuận dành cho nhà phát triển mới cho phép chúng tôi nói về nội dung này :)
Frank Schmitt

4
Bạn không thể sử dụng các tiện ích mở rộng để giữ một giao thức có phương thức init, chẳng hạn như NSCoding. Điều đó làm cho khó phân tách nếu bạn không thể sử dụng nó trong mọi trường hợp.
Matthew Knippen

149
Tính đến phiên bản beta 4, Xcode 6 công nhận // MARK:, // TODO:// FIXMEtrong Swift nguồn và danh sách họ trong thanh nhảy. (BTW, nó đã được thực hiện trong nguồn (Obj) C - #pragma markkhông phải là cách duy nhất.) Và vâng, bạn vẫn có thể thêm -vào MARKđể đặt dấu phân cách trong menu.
gà trống

17
+1 cho đề xuất tiện ích mở rộng. Ngay cả khi MARKlàm việc bây giờ, sử dụng các phần mở rộng để nhóm một số loại mã liên quan đến ngữ nghĩa (đặc biệt là triển khai giao thức) vẫn có thể hữu ích. IMHO đọc tốt hơn rất nhiều khi có tuyên bố tuân thủ giao thức của bạn ngay bên cạnh các phương thức triển khai nó, chứ không phải 5 khai báo giao thức ở đầu tệp và 50 triển khai phương thức liên quan nằm rải rác ở đâu đó bên dưới.
gà trống

37
@StevenKramer: Tương tự như với #pragma mark. // MARK: -chỉ là một dấu phân cách, // MARK: - stuffcung cấp cho bạn một dấu phân cách và một tiêu đề và // MARK: - stuff -cung cấp cho bạn một dấu phân cách, một tiêu đề và một dấu phân cách khác tất cả trong một dòng nhận xét.
gà trống

174

Lên đến Xcode 5 chỉ thị tiền xử lý #pragma marktồn tại.

Từ Xcode 6 trở đi, bạn phải sử dụng // MARK:

Các tính năng tiền xử lý này cho phép đưa một số cấu trúc vào hộp thả xuống của trình soạn thảo mã nguồn.

vài ví dụ :

// MARK:

-> sẽ được đi trước bởi một dải phân cách ngang

// MARK: your text goes here

-> đặt 'văn bản của bạn ở đây' in đậm trong danh sách thả xuống

// MARK: - your text goes here

-> đặt 'văn bản của bạn ở đây' in đậm trong danh sách thả xuống, trước một dải phân cách ngang

cập nhật: thêm ảnh chụp màn hình 'vì một số người dường như vẫn có vấn đề với điều này:

nhập mô tả hình ảnh ở đây


1
Không có dấu phân cách trong XCode 6.1.1 sử dụng // MARK: - textcho tôi và danh sách thả xuống hiển thị MARK: văn bản thay vì chỉ văn bản .
mostruash

hoạt động tốt với tôi trong Xcode 6.1.1, tôi vừa thêm ảnh chụp màn hình - vui lòng kiểm tra với mã của bạn?
Ronny Webers

Tôi quên đề cập rằng tôi đã thử nó cho các tệp Objective-C. Bỏ phiếu cho những nỗ lực mặc dù, cảm ơn bạn.
mostruash 23/2/2015

1
Tôi hiểu rồi, giờ thì rõ rồi :-) Câu hỏi ban đầu hỏi về Swift nên tôi không nghĩ về điều đó. Để hoàn thiện: trong Objective-C, bạn có thể làm tương tự bằng cách sử dụng: #pragma mark - Văn bản đánh dấu của bạn ở đây hoặc chỉ #pragma mark - nếu bạn cần một thanh, hoặc #pragma đánh dấu Văn bản đánh dấu của bạn ở đây để có được cùng không có thanh (xin lỗi, tôi không thể sửa lỗi đánh dấu cho các đoạn mã, tôi đã in đậm)
Ronny Webers

Nó đã thay đổi một chút trong Xcode 8.1, nhưng quy tắc này thường được làm việc, thích câu trả lời này là tốt nhất: D
windsound

167

Đối với những người quan tâm đến việc sử dụng tiện ích mở rộng so với dấu pragma (như đã đề cập trong nhận xét đầu tiên), đây là cách triển khai từ Kỹ sư 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
    }

}

Đây cũng không hẳn là cách thực hành tốt nhất, nhưng đây là cách bạn làm nếu bạn muốn.


6
Điều này rất tuyệt, nhưng sẽ rất tuyệt nếu tiện ích mở rộng có thể có tên.
Matthew Knippen

16
@Matthew - Bạn có thể sử dụng typealias. Ví dụ typealias DataSource = SwiftTableViewController. Sau đóextension Datasource {}
Logan

1
@PhongLe UITableViewControllerkhông phải là một giao thức, nó là một lớp. Bạn có thể có nghĩa UITableViewControllerDataSource, nhưng đây không phải là mẫu được sử dụng trong ví dụ.
KPM

4
Tôi chỉ tự hỏi tại sao không extensioncó tiêu đề với giao thức, như extension SwiftTableViewController : UITableViewController, nó sẽ dễ đọc hơn để xem lý do tại sao bạn thêm phần mở rộng đó vào lớp.
holex

7
Lưu ý rằng nếu tiện ích mở rộng của bạn tồn tại duy nhất để hoạt động như một triển khai giao thức, bạn có thể đặt tên cho tiện ích mở rộng: extension SwiftTableViewController : UITableViewDelegate { .. }extension SwiftTableViewController : UITableViewDatasource { .. }
Craig Otis

117

Pragma mark - [SOME TEXT HERE]đã được sử dụng trong Objective-C để nhóm một số chức năng lại với nhau bằng cách tách dòng.

Trong Swift bạn có thể đạt được điều này bằng cách sử dụngMARK, TODO OR FIXME

Tôi. DẤU : //MARK: viewDidLoad

Điều này sẽ tạo một đường ngang với các chức năng được nhóm lại dưới viewDidLoad (hiển thị trong ảnh chụp màn hình 1)

Ảnh chụp màn hình 1

ii. LÀM : //TODO: - viewDidLoad

Điều này sẽ nhóm chức năng trong TODO: - danh mục viewDidLoad (hiển thị trong ảnh chụp màn hình 2)

Ảnh chụp màn hình 2

iii. CỐ ĐỊNH: //FIXME - viewDidLoad

Điều này sẽ nhóm chức năng trong FIXME: - danh mục viewDidLoad (hiển thị trong ảnh chụp màn hình 3)

Ảnh chụp màn hình 3

Kiểm tra tài liệu táo này để biết chi tiết.


Lưu ý rằng "-" sau TODO và FIXME không làm gì cả. "-" chỉ liên quan đến chỉ thị Mark.
rismay 2/2/2016

1
Nó cũng tạo ra một phần lớn, viết hoa trong tiêu đề "minimap" mà bạn có thể hiển thị dọc theo bên phải của tệp nguồn. Khá tiện dụng.
Oscar

66

Tài liệu chính thức

Tài liệu chính thức của Apple về Xcode Jump Bar: Thêm chú thích mã vào thanh nhảy

Jump Bar Ảnh chụp màn hình cho Mã mẫu

Mã mẫu

Hành vi trong Xcode 10.1 và macOS 10.14.3 (Mojave)

Xcode 10.1 và macOS 10.14.3

Hành vi trong Xcode 10.0 và macOS 10.13.4 (High Sierra)

Xcode 10.0 và macOS 10.13.4

Hành vi trong Xcode 9.4.1 và macOS 10.13.0

Xcode 9.4.1 và macOS 10.13.0

Thảo luận

!!!:???:đôi khi không thể được hiển thị.


!!!: và ???: cú pháp không hoạt động trên Xcode 11.3.1
Jayprakash Dubey

56

Trong mã Objective-C, Xcode phát hiện các bình luận giống như // MARK: - foodi động hơn một chút so với #pragma. Nhưng những thứ này dường như cũng không được chọn (chưa?).

Chỉnh sửa: Đã sửa trong Xcode 6 beta 4.


6
Tôi chắc chắn hy vọng họ sẽ sớm cung cấp dịch vụ này vì tôi muốn giữ mọi thứ được tổ chức với các dấu hiệu pragma>. <
Arbitur

1
Tôi có thể xác nhận rằng // MARK: -hiện tại không hoạt động.
Rui Peres

Không hoạt động, nhưng mã mẫu bị vấy bẩn với kiểu nhận xét đó, vì vậy cuối cùng nó sẽ được chọn.
Nate Cook

1
nó là quan trọng các bình luận nên được xách tay? bởi vì việc chuyển mã Swift sang bất kỳ ngôn ngữ nào khác trực tiếp đã là thách thức đối với các nhà phát triển.
holex

Hmmm, tôi thấy rất nhiều người bình luận rằng nó hoạt động, nhưng tôi đang dùng Beta 6 và // MARK:dường như không hoạt động. Tôi đã thử với & không có khoảng trống, có và không có dấu hai chấm, tất cả chữ hoa và chữ hỗn hợp (Mark). Có một mẹo? Tôi có cần phải kích hoạt pref hay gì không?
Olie

37

Tôi nghĩ Extensionslà một cách tốt hơn thay vì #pragma mark.

Mã trước khi sử dụng 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) {
        ...
    }
}

Mã sau khi sử dụng 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
Tôi nghĩ rằng tiềm năng của nó lớn hơn nhiều so với pragma nhưng tại thời điểm này, pragma vẫn tốt hơn bởi vì tiện ích mở rộng không hiển thị tên giao thức hoặc tên tùy chỉnh trong menu thả xuống như pragmas làm ( xem bên dưới câu trả lời của Whasssaaahhh )
nacho4d

Mã "// Mark:" mới hữu ích, nhưng tôi cũng thích ví dụ rõ ràng của bạn về cách sử dụng tiện ích mở rộng - đặc biệt là đối với các hàm ủy nhiệm!
ElmerCat

tiện ích mở rộng cũng giới hạn những gì bạn có thể làm - ví dụ: không có thuộc tính được lưu trữ
Vorlon bối rối

1
Tôi sử dụng cả hai, bởi vì extensionmột mình không thực sự nổi bật trong menu thả xuống của điều khiển bánh mì của Xcode.
Nicolas Miari

36

Xcode 8 hiện xử lý nó như sau và hiển thị như thế này trong trình đơn thả xuống phương thức:

nhập mô tả hình ảnh ở đây


Thế còn Mark :? Nó hiển thị như // ARK: đối với tôi trong Xcode 8
fnc12

Kiểm tra mã của bạn, bạn có thể đang sử dụng một số ký tự unicode phía trên dòng // MARK :. Vì một số lý do, xcode bị lẫn lộn (và vì tệ) và không thể xử lý được.
carlos_ms

3
Các !!!???cú pháp không xuất hiện để được làm việc trên Xcode 8.3.3 ...
Chris Frederick

@ChrisFrederick Thậm chí !!! và ??? dosen dường như không hoạt động trên Xocde 11.3.1
Jayprakash Dubey

34

Đã xác nhận với một Kỹ sư Apple trong phòng thí nghiệm Swift sáng nay tại WWDC rằng hiện tại không có bất kỳ #pragma nào hoặc tương đương, họ coi đây là một lỗi và nó sẽ đến sớm, vì vậy tôi đoán là beta 2, tôi hy vọng.

Dù sao, nó đang trên đường.


Xcode hiện hỗ trợ // MARK:, // TODO: và // FIXME để chú thích mã của bạn và liệt kê chúng trong thanh nhảy


6
Beta 2, vẫn chưa có nó
Caescofry

Lạ thật. Làm việc cho tôi tốt PS: cập nhật Xcode của bạn.
Daniel

@Daniel: Phiên bản nào của Xcode? Tôi đang sử dụng Xcode 6.4 và dường như không hoạt động trên đó.
Jayprakash Dubey

19

Có ba tùy chọn để thêm #pragma_markvào Swift:

1) // MARK: - your text here -

2) // TODO: - your text here -

3) // FIXME: - your text here -

Lưu ý: Sử dụng -để thêm dấu phân cách


17

Sử dụng

// MARK: SectionName

hoặc là

// MARK: - SectionName

Điều này sẽ đưa ra một dòng trên dấu pragma, làm cho nó dễ đọc hơn.

Để dễ dàng chỉ cần thêm

// MARK: - <#label#>

để đoạn mã của bạn.

Cách khác -

Sử dụng nó theo cách này

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

Điều này sẽ không chỉ thêm dấu (giống như dấu pragma) mà còn phân tách mã độc đáo.


1
Nếu bạn sử dụng Swiftlint , nó sẽ phàn nàn về các //MARKđịnh dạng (không gian) và đề nghị // MARK: (text)( một không gian giữa //và MARK, không có khoảng trống giữa MARK:, và một không gian giữa :và tên phần)
Nicolas Miari

2
@NicolasMiari, Cảm ơn, tôi đã chỉnh sửa theo đề nghị của bạn. Và cũng sẽ thử sử dụng SwiftLint cho dự án tiếp theo. :)
Nikhil Manapure

13
//# MARK: - Spinner Class Methods

Thêm một dòng giữa dấu hai chấm và mô tả của bạn để chèn một dòng phân cách. Điều này giúp tổ chức mã của bạn nhiều hơn. Mã và ảnh chụp màn hình ở trên sử dụng nhận xét Mark với một dòng đi kèm.

  1. // # MARK: - Phương thức văn bản (LINE)
  2. // # MARK: Phương thức văn bản (KHÔNG LINE)

Điều này chỉ hoạt động với các bình luận Mark.

nhập mô tả hình ảnh ở đây


12

Bạn cũng có thể quan tâm đến các chỉ thị của trình biên dịch Swift 4.2 / XCode 10 như

#warning("Some string to display")

#error("Some error to display")

Nó có thể hữu ích khi bạn thực sự không muốn bỏ lỡ điều gì.

nhập mô tả hình ảnh ở đây


Mát mẻ. Tôi sẽ cảnh báo các đồng đội khác khi cậu bé vi phạm quy tắc trở đi.
Sazzad Hissain Khan

9

Lập trình viên chuyên nghiệp phải được sử dụng thẻ này cho mã tốt. Nó cũng tốt cho công việc nhóm.

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

Rất dễ tìm thấy phương pháp như thế này

Rất dễ tìm thấy phương pháp như thế này


6

Trong Xcode 11, họ đã thêm minimap có thể được kích hoạt Editor -> Minimap.

Minimap sẽ hiển thị từng văn bản đánh dấu để định hướng nhanh trong mã. Mỗi nhãn hiệu được viết như// MARK: Variables

nhập mô tả hình ảnh ở đây


5

//MARK:dường như không hoạt động với tôi trong Xcode 6.3.2. Tuy nhiên, đây là những gì tôi đã làm để làm cho nó hoạt động :

1) Mã:

import Cocoa

class MainWindowController: NSWindowController {

    //MARK: - My cool methods

    func fly() {
    }

    func turnInvisible() {

    }
}

2) Không jump barcó gì thay đổi khi thêm //MARK: bình luận. Tuy nhiên, nếu tôi nhấp vào tên ngoài cùng bên phải trong thanh nhảy, trong trường hợp của tôi, nó MainWindowController(with a leading C icon)sẽ hiển thị các hiệu ứng của // MARK: bình luận, cụ thể là một tiêu đề có nội dung "Phương thức tuyệt vời của tôi":

nhập mô tả hình ảnh ở đây

3) Tôi cũng nhận thấy rằng nếu tôi nhấp vào một trong các phương thức trong mã của mình, thì phương thức đó sẽ trở thành mục nhập ngoài cùng bên phải trong thanh nhảy. Để có MainWindowController(with a leading C icon)được mục nhập đúng nhất trong thanh nhảy, tôi phải nhấp vào khoảng trắng phía trên phương thức của mình.


Không phải đó là cách nó được coi là? Rằng bạn phải bấm vào thanh trên cùng?
Arbitur

3

Apple tuyên bố trong phiên bản mới nhất của Ứng dụng xây dựng ca cao ,

Trình biên dịch Swift không bao gồm bộ tiền xử lý. Thay vào đó, nó tận dụng các thuộc tính thời gian biên dịch, xây dựng cấu hình và các tính năng ngôn ngữ để thực hiện cùng chức năng. Vì lý do này, các chỉ thị tiền xử lý không được nhập trong Swift.

Ký tự # dường như vẫn là cách bạn làm việc với các cấu hình xây dựng khác nhau và những thứ tương tự, nhưng có vẻ như họ đang cố gắng cắt giảm nhu cầu của bạn đối với hầu hết quá trình tiền xử lý và chuyển bạn sang các tính năng ngôn ngữ khác hoàn toàn. Có lẽ điều này là để hỗ trợ cho hoạt động của Sân chơi và REPL hoạt động gần nhất có thể với mã được biên dịch đầy đủ.


0

Thêm một mục việc cần làm: Chèn một nhận xét với tiền tố TODO :. Ví dụ: // TODO: [mục việc cần làm của bạn].

Thêm lời nhắc sửa lỗi: Chèn nhận xét với tiền tố FIXME :. Ví dụ: // FIXME: [nhắc nhở sửa lỗi của bạn].

Thêm một tiêu đề: Chèn một bình luận với tiền tố Mark :. Ví dụ: // MARK: [tiêu đề phần của bạn].

Thêm một dòng phân cách: Để thêm một dấu phân cách phía trên chú thích, hãy thêm dấu gạch nối (-) trước phần chú thích của chú thích. Ví dụ: // MARK: - [nội dung của bạn]. Để thêm dấu phân cách bên dưới chú thích, hãy thêm dấu gạch nối (-) sau phần chú thích của chú thích. Ví dụ: // MARK: [nội dung của bạn] -.


0

Thử cái này:

// MARK: Reload TableView

func reloadTableView(){

    tableView.reload()
}

0

Dấu hiệu thực dụng là một cách để cải thiện khả năng đọc mã của bạn. Các bình luận pragma sẽ xuất hiện như các thẻ trên thanh nhảy Xcode.

//MARK:  <Your comment goes here>

Ví dụ: Trong mã,

//MARK: Properties

// MARK: View Life cycle

//MARK: Helper methods

Đây là cách nó sẽ xuất hiện trong thanh nhảy Xcode.

nhập mô tả hình ảnh ở đây


Bạn chỉ cần chèn chúng vào đúng chỗ trong tệp của bạn.
varunrathi28
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.