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.
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.
Câu trả lời:
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.
-type f
tùy chọn vào find
lệ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.swift
nhóm này cũng sẽ gặp phải lỗi tương tự tôi gặp phải vì đó R.swift
là một thư mục
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_THIS
là 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.
let fixMeMakeMeNonOptional: Int
cung 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.
Bắt đầu với Xcode 10 và Swift 4.2, giờ bạn sẽ có thể sử dụng #warning
lạ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 #if
kiể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ó #error
nếu bạn muốn bản dựng của mình thất bại.
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 swiftlint
sau 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 TODO
và của bạn FIXME
xuấ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!
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
}
Để sử dụng Swift 2
@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
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/"
egrep --directories='skip'
để bỏ qua các thư mục có tên như Device.swift
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.
Tôi đã đề xuất và triể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 master
toolchain trên swift.org .
#if os(macOS)
#error("macOS is not supported")
#endif
#warning("finish this")
Một Cốc Cốc mà tôi đang sử dụng có .swift
tê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 f
vào find
lệnh khắc phục sự cố đó bằng cách chỉ xem các tệp khớp với *.swift
thay 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/"
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õ:
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).
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ó.
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 unused
với chế độ tự động hoàn thành vẫn hoạt động và dự án vẫn đang biên dịch.
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
Ư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:
//WARNING
giống như #pragma//MARK
nhưng hiện tại cả hai đều không được thêm vào XCode beta.