Swift: #warning tương đương


192

Swift có tương đương #warning không? Nó chỉ đơn giản được sử dụng để hiển thị cảnh báo trong GUI của Xcode

Tôi cũng quan tâm đến việc có tương đương #error không.

Apple đã nói rằng dấu #pragma sẽ sớm ra mắt, nó có thể giống với điều này.

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


7
Tôi cho rằng nó sẽ //WARNINGgiống như #pragma //MARKnhưng hiện tại cả hai đều không được thêm vào XCode beta.
Lord Zsolt

1
Tôi đặc biệt khuyên bạn nên gửi một radar để yêu cầu // CẢNH BÁO
pixel

@pixel Tôi vừa mới nộp một radar
Một số

Bạn có thể chấp nhận câu trả lời của Jordan Smith không? Điều này hiện được tích hợp vào Swift dưới dạng #warning
Bill

Câu trả lời:


157

Trong tương lai, các nhà phát triển của Apple rất có thể phát hành một //WARNING:mốc, hoặc cung cấp chức năng cho một mốc khác được đặt tên.

Tuy nhiên, để có được chức năng này với Swift trong Xcode, bạn có thể thực hiện các thao tác sau như được phác thảo bởi Ben Dodson & Jeffrey Sambells:

Thêm Tập lệnh chạy mới vào tab giai đoạn xây dựng của mục tiêu (cài đặt dự án> giai đoạn xây dựng> '+'> giai đoạn tập lệnh chạy mới) và dán mã sau vào hộp trống:

TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"

Điều này sẽ buộc Xcode gắn cờ cảnh báo tại thời điểm biên dịch cho bất kỳ // TODO:hoặc // FIXME:nhận xét nào bạn đánh dấu.

Ngoài ra, bạn có thể sửa đổi TAGS bằng thẻ tùy chỉnh: TAGS="WARNING:"trong đoạn mã trên sẽ giữ hành vi mặc định cho TODO & FIXME và sẽ đưa ra cảnh báo thời gian biên dịch đối với bất kỳ nhận xét nào được đánh dấu là // WARNING:.

http://bendodson.com/weblog/2014/10/02/showing-todo-as-warning-in-swift-xcode-project/ http://jeffreysambells.com/2013/01/31/generate-xcode- cảnh báo-từ-todo-bình luận

EDIT: 18/11/14

@ david-h nêu lên một điểm tốt trong bình luận của mình. Nếu bạn muốn chỉ đưa ra những cảnh báo này trong một cấu hình xây dựng cụ thể, bạn có thể làm như sau:

if [ "${CONFIGURATION}" = "Debug" ]; then
TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
fi

Ngoài ra, bạn có thể sử dụng "Phát hành" thay vì "Gỡ lỗi" để chỉ nhắm mục tiêu xây dựng sản xuất.


Đây là một giải pháp tạm thời rất đẹp cho đến khi Apple sửa lỗi nó :)
SomeGuy

Vấn đề với điều này là ứng dụng của tôi có hai chế độ - phát triển và sản xuất. Tôi muốn biết rằng nó xây dựng sạch trong sản xuất, nhưng tôi nhận được một cảnh báo trong phát triển về cơ bản nhắc nhở tôi đang ở chế độ dev - sử dụng các URL khác nhau, thời gian chờ, các cài đặt khác, v.v. Đề xuất của Arie ở trên cho phép tôi làm điều này, kỹ thuật của bạn chỉ cờ mọi thứ. Điều đó nói rằng, kỹ thuật này có công dụng của nó chắc chắn vì vậy tôi cũng đã bình chọn nó!
David H

Thật là một ý tưởng hữu ích! Cảm ơn vì đã chia sẻ thông tin hữu ích này.
Tommy

@kyle Bạn có thể vui lòng cho tôi biết ý nghĩa của perl -p -e "s / ($ TAGS) / cảnh báo: \ $ 1 /" dòng này
Rocker

3
Hoạt động rất tốt, tuy nhiên tôi đã phải thêm -type ftùy chọn vào findlệnh để loại trừ các thư mục khỏi kết quả tìm kiếm. Đây không phải là vấn đề đối với hầu hết mọi người, nhưng bất kỳ ai sử dụng R.swiftnhóm này cũng sẽ gặp phải lỗi tương tự tôi gặp phải vì đó R.swiftlà một thư mục
Dan F

156

Biên tập

Kể từ Swift 4.2, hỗ trợ cấp độ ngôn ngữ có sẵn cho cả cảnh báo và lỗi xây dựng.

#warning("Warning description")
#error("Throws a build error")

Câu trả lời gốc

Nhanh chóng, bẩn thỉu, và đơn giản một cách thanh lịch cùng một lúc.

// Description of what you need to fix

var FIX_ME__🛠🛠🛠: AnyObject

Ném một cảnh báo rằng 'FIX_ME__🛠🛠🛠' không bao giờ được sử dụng.

Bạn có thể thêm biểu tượng cảm xúc vào tên biến nếu bạn thích ... Tôi thường sử dụng 😱 và, cho một cái gì đó thực sự cần sửa chữa tôi thậm chí sẽ xem xét. Bạn có thể thay thế FIX_ME__với bất cứ điều gì bạn muốn: ALGORITHM_NEEDS_REVIEW, BugID_148, hoặc JOHNNY_YOU_BROKE_THISlà một số ví dụ.

Nhanh chóng, không cần thiết lập, súc tích và biểu tượng cảm xúc thậm chí có thể thêm sự hài hước / cá tính vào mã của bạn. Đôi khi giải pháp đơn giản nhất là giải pháp tốt nhất.


6
... Tại sao tất cả các phiếu giảm? Điều này hoạt động tốt như bất kỳ phương pháp nào khác ở đây. Nếu bạn không bình chọn, ít nhất là đưa ra một lý do, có thể tôi đã không đủ rõ ràng hoặc có gì đó không đúng với những gì tôi đang làm. Tôi muốn biết nếu có.
Jordan Smith

16
Vâng, tôi không chắc tại sao điều này không được nâng cao hơn nữa. Tất cả các giải pháp khác là quá phức tạp.
Simone Manganelli

3
@ZaEeMZaFaR trình biên dịch rất có thể sẽ thoát khỏi nó. Bên cạnh đó, trong hầu hết các trường hợp, các vấn đề này sẽ được khắc phục trước khi phát hành. Và - ngay cả khi vì bất kỳ lý do gì, trình biên dịch không đủ thông minh để loại bỏ nó (tôi nghĩ điều này rất khó xảy ra) - 100 vars Int trong bộ nhớ là 6,4kb bộ nhớ - về cơ bản không có gì. Tôi không nghĩ rằng bạn đã có một điểm hợp lệ xin lỗi.
Jordan Smith

4
Tôi đã sử dụng những người khác nhưng chuyển sang sử dụng cái này. Đó là cách đơn giản nhất và bạn thậm chí có thể cung cấp cho mình một thông điệp nhỏ sẽ hiển thị trong cảnh báo, nghĩa là: let fixMeMakeMeNonOptional: Intcung cấp cho bạn Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it trong trình điều hướng vấn đề. Tất cả các giải pháp khác cung cấp cho bạn thông báo lỗi chung hơn nhiều.
Nathan Perry

1
@NathanPerry vâng, đồng ý. Thiết lập một số thứ phức tạp không phải lúc nào cũng là một lựa chọn, đặc biệt là khi bạn làm việc trong một nhóm hoặc trên nhiều dự án, v.v. Ngoài ra, các giải pháp đơn giản luôn là tốt nhất. Tôi hiện chỉ đưa thông điệp bên cạnh nó trong một bình luận, nhưng những gì bạn làm cũng không phải là một ý tưởng tồi.
Jordan Smith

81

Đăng cập nhật WWDC 2018

Bắt đầu với Xcode 10 và Swift 4.2, giờ bạn sẽ có thể sử dụng #warninglại như sau:

#warning("TODO: Clean up this code after testing")

Điều này sẽ hiển thị như một cảnh báo trong Xcode đúng như mong đợi!

Điều này hoạt động ngay cả khi kết hợp với #ifkiểm tra, ví dụ như sau đây sẽ chỉ hiển thị cảnh báo nếu nền tảng mục tiêu của bạn là iOS:

#if os(iOS)
    #warning("this code is untested in iOS")
#endif

Cũng có #errornếu bạn muốn bản dựng của mình thất bại.


Trả lời trước WWDC 2018

Trong Swift sử dụng XCode 6, bạn có thể sử dụng các loại mốc khác nhau cho các mục đích khác nhau. Đây là những gì Apple nói về nó:

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

Vì vậy, để thiết lập cảnh báo với một mô tả, bạn sẽ sử dụng một cái gì đó như thế này:

//TODO: Clean up this code after testing

Nếu bạn chỉ muốn đặt một dấu ngắn (giả sử bạn sẽ nhớ phải làm gì), hãy sử dụng:

//FIXME

EDIT: Tuy nhiên, các mốc này chỉ xuất hiện trong thanh nhảy của XCode, đây có thể không phải là điều bạn mong muốn và những gì người ta mong đợi - đặc biệt là từ các dấu // TODO: và // FIXME. Tôi đã nộp một radar trên đó: # 17776817. Hy vọng Apple sẽ bổ sung điều này trong các bản dựng sắp tới trong XCode 6.

GIẢI PHÁP (EDIT 2): Nếu bạn cài đặt Swift Linter qua Homebrew (chạy brew install swiftlintsau a brew update) và thêm tập lệnh xây dựng được đề xuất vào dự án của bạn, thì bạn sẽ thấy tất cả các cột mốc TODOvà của bạn FIXMExuất hiện dưới dạng cảnh báo trong Xcode. SwiftLint thậm chí sẽ thêm một số cảnh báo / lỗi mà bạn có thể định cấu hình để phù hợp với nhu cầu của mình - Tôi chỉ có thể khuyên bạn nên sử dụng SwiftLint và nó giải quyết vấn đề này một cách tuyệt vời!


7
Thật không may, những thứ này không hiển thị trong bảng cảnh báo khi bạn biên dịch ứng dụng của mình. Tôi vẫn đang chờ đợi một ngón tay thò ra như ngón tay cái đau để bạn không thể quên chúng. Chúng chỉ xuất hiện trong thanh nhảy và bạn sẽ cần nhớ tìm kiếm dự án của mình cho "// TODO" để tìm thấy nó. Hoặc nếu có ai biết cách xem chúng cho toàn bộ dự án, hãy cho tôi biết. - thời gian cho một Radar khác :)
Một số

1
À đúng rồi, bạn nói đúng. Tôi nghĩ thanh nhảy là thanh bên trái và những dấu đó sẽ xuất hiện trên Bộ điều hướng phát hành, nhưng chúng không có. Tôi vừa mới nộp một radar về điều đó: # 17776817. :)
Jeehut

@SomeGuy Ý của bạn là gì khi chúng xuất hiện trong thanh nhảy? Từ những gì tôi có thể thấy họ không ở đâu trên thanh nằm ở đầu cửa sổ soạn thảo trong Xcode. Cách duy nhất để nhận thấy chúng (với tôi) dường như là tìm kiếm chúng bằng Command + F. Các mốc được hiển thị ở đâu?
alm

2
@almel Jumpbar là trình đơn thả xuống ở đầu tệp, nó cung cấp danh sách các hàm trong tệp hiện tại i.cubeupload.com/jLRwTs.png
Một số

55

Vẫn chưa được nhóm Apple thêm vào. Những gì tôi quyết định làm có lẽ là một sự gian lận, nhưng ít nhất nó cũng cho tôi thấy một thông điệp FIXME. Vì vậy, những gì tôi làm là khai báo hàm FIXME () trong tệp Swift:

@availability(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
func FIXME()
{
}

và khi tôi gọi nó từ bất kỳ chức năng nào khác, nó sẽ hiển thị một cảnh báo, ví dụ:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
    FIXME()     // Incomplete method implementation.
    return 0
}

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

Để sử dụng Swift 2

@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")

2
Chỉ dành cho bản ghi: @avcellence đã được đổi tên thành "@av Available" trong swift 2.
Tobias

42

Nhìn vào bài viết này .

Bạn có thể viết kịch bản của riêng bạn sẽ làm nổi bật tất cả các thẻ.

TAGS="TODO:|FIXME:"
ERRORTAG="ERROR:"
find "${SRCROOT}" \( -name "*.h" -or -name "*.m" -or -name "*.swift" \) -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$|($ERRORTAG).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/" | perl -p -e "s/($ERRORTAG)/ error: \$1/"

Kết quả này là: nhập mô tả hình ảnh ở đây


Thêm vào egrep --directories='skip'để bỏ qua các thư mục có tên như Device.swift
chunkyguy

12

Thay vào đó, nếu bạn muốn một cái gì đó hiển thị trong bảng cảnh báo, bạn có thể viết một cái gì đó như:

if (false){
   var x = 2;
}

Bạn thực sự không thể có bất kỳ văn bản nào để hiển thị, nhưng ít nhất đó là một điểm đánh dấu rõ ràng hơn, đặc biệt là nếu bạn có xu hướng coi (hầu hết) các cảnh báo như lỗi.


11
Hoặc chỉ cần làm nếu sai {"thông báo cảnh báo"}
Bao Lei

Giải pháp này thật tồi tệ. Nhưng dường như là tốt nhất có sẵn. Bình chọn, cảm ơn.
skagedal

6

Tôi đã đề xuấttriển khai tính năng này và nó sẽ xuất xưởng với Swift 4.2. Bạn có thể sử dụng nó ngay bây giờ bằng cách tải xuống mastertoolchain trên swift.org .

#if os(macOS)
  #error("macOS is not supported")
#endif
#warning("finish this")

5

Một Cốc Cốc mà tôi đang sử dụng có .swifttên của nó, vì vậy một thư mục đã được trả lại, khiến cho kịch bản của Kyle bị sập. Thêm -type fvào findlệnh khắc phục sự cố đó bằng cách chỉ xem các tệp khớp với *.swiftthay vì trả về các thư mục khớp với mẫu.

Mã cuối cùng mà tôi đã sử dụng:

TAGS="TODO:|FIXME:"
echo "searching ${SRCROOT} for ${TAGS}"
find "${SRCROOT}" \( -name "*.swift" \) -type f -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"

1
Có cách nào để không có trình biên dịch phàn nàn? Tôi nhận được "Lỗi phát ra lệnh / bin / sh nhưng không trả về mã thoát không khác để chỉ ra lỗi"
Chris Paveglio

Để thay thế, hãy xem nhận xét
chunkyguy

4

Nếu bạn không thích điều chỉnh thiết lập bản dựng của mình, một biện pháp khắc phục tại nhà đơn giản khác là dán một trình giữ chỗ biên tập trước bình luận:

<#todo#>// stop and fixme!

Bạn nhận được một trình giữ chỗ của Trình soạn thảo trong tệp nguồn Lỗi lỗi khi bạn xây dựng, nhưng không giống như giải pháp của Jordan, không có lỗi trực tiếp làm phiền bạn khi gõ:

giữ chỗ biên tập


Ý tưởng hay - nhưng không phải là ý tưởng để đưa ra cảnh báo, và không phải là một lỗi? Làm điều này sẽ không cho phép bạn xây dựng cho đến khi bạn loại bỏ nó, trong nhiều trường hợp (hầu hết?) Chắc chắn không phải là điều bạn muốn. Dấu ấn Todo và fixme đôi khi liên quan đến công việc đáng giá hàng tuần - Tôi tưởng tượng bạn muốn xây dựng và điều hành dự án của mình trong thời gian này :)
Jordan Smith

Chắc chắn, đó là một điểm tốt. Cách tiếp cận này chỉ hữu ích cho các mục việc cần làm khẩn cấp hơn phải xảy ra trước khi cam kết hoặc thậm chí chạy ứng dụng. Lợi ích chính là làm nổi bật cú pháp và các phần tử soạn thảo khác tiếp tục hoạt động mặc dù có sự hiện diện của trình giữ chỗ này. Bản thân tôi sử dụng một số cách tiếp cận khác, bao gồm cả phương pháp của bạn, nhưng trình giữ chỗ đôi khi hữu ích khi đa nhiệm. Nó phù hợp với các trường hợp sử dụng tương tự như Xcode giữ chỗ chèn khi tự động hoàn thành một cuộc gọi chức năng.
Minh Nguyễn

3

Sau nhiều tìm kiếm và khao khát, tôi tin chắc rằng không có thực thể nào như vậy tồn tại. Tôi vẫn hy vọng với các ghi chú phát hành Xcode mới nhất đề cập đến việc tiếp tục thiếu cơ chế đánh dấu #pragma, #warning và #error cũng có thể sẽ xuất hiện.

Bên cạnh đó, tôi đặc biệt khuyên bạn nên gửi Radar với Apple tại bugreport.apple.com để thêm chức năng này (bạn có thể lừa đảo 17702491).


1
Tôi đã thực hiện phần của mình: rdar: // 19005171
David H

1
Cũng được lấp đầy trong một radar
HixField

2

Chúng tôi đã viết một công cụ có thể định cấu hình cho phép bạn đặt các cảnh báo và lỗi trong Xcode Issue Navigator dựa trên thẻ nhận xét và cấu hình bản dựng: https://github.com/doubleencore/XcodeIssueGenerator

Cài đặt nó:

brew tap doubleencore/tap
brew install xcodeissuegenerator

Sau đó đặt một dòng trong Giai đoạn Xây dựng Tập lệnh:

# Mark WARNINGs, SERIOUSs, and TODOs as warnings in DEBUG builds excluding the Vendor and Third Party directories.
XcodeIssueGenerator -b DEBUG -w "WARNING, SERIOUS, TODO" -x "Vendor/, Third Party/"

Đây là một bài viết mô tả cách chúng tôi sử dụng nó.


2

Tôi có thể bị trễ bữa tiệc với các lỗi và cảnh báo hỗ trợ Xcode 10, nhưng chỉ cần đặt Chuỗi:

"Need to finish implementing this"

sẽ đưa ra cảnh báo: String literal is unusedvới chế độ tự động hoàn thành vẫn hoạt động và dự án vẫn đang biên dịch.


1

Câu trả lời của tôi là không hoàn toàn đáp ứng câu hỏi của bạn, nhưng nếu bạn muốn một cái gì đó dễ dàng, bạn có thể sử dụng này plugin của Alcatraz mà làm việc trong tất cả các dự án mà không cần bất kỳ chuẩn bị bổ sung. Chỉ cần làm như sau:

1) install Alcatraz (Nice package manager for Xcode Plug-ins) by entering this line in terminal: 
curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
2) Then restart Xcode and on it launch agree to install all bundles not included in Xcode
3) In Xcode select menu item -> Window -> Package manager -> type in search panel XTodo and press install
4) Relaunch Xcode and again agree to install additional bundles
5) From now press Ctrl + T and you will see all Tags in nice window

Nó cũng có các tùy chọn để thêm các thẻ mới

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


1

Ưu điểm của đoạn trích này - nó không hiển thị cảnh báo từ Pods:

if [ "${CONFIGURATION}" = "DEBUG" ]; then 
    TAGS="TODO:|FIXME:|WARNING:|warning:" find "." \( -name "*.swift" \) -not -path "./Pods/*" -print0 | xargs -0 egrep --with-filename --line-number --only-matching "($TAGS).*\$" | perl -p -e "s/($TAGS)/ warning: \$1/"
fi

Cài đặt thế nào:

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

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.