Swift: #warning equivalen

192

Apakah Swift setara dengan #warning? Ini hanya digunakan untuk menampilkan peringatan di GUI Xcode sendiri

Saya juga tertarik pada apakah ada yang setara dengan #error.

Apple mengatakan tanda #pragma akan segera hadir, mungkin bisa sama dengan ini.

masukkan deskripsi gambar di sini

Beberapa pria
sumber
7
Saya menganggap itu akan //WARNINGseperti #pragma akan //MARKtetapi saat ini keduanya tidak ditambahkan ke XCode beta.
Lord Zsolt
1
Saya sangat menyarankan untuk mengajukan radar untuk meminta // PERINGATAN
piksel
@ Pixel Saya baru saja mengajukan radar
SomeGuy
Bisakah Anda menerima jawaban Jordan Smith? Ini sekarang dibangun ke dalam Swift sebagai #warning
Bill

Jawaban:

157

Di masa depan, Apple devs mungkin akan merilis //WARNING: landmark, atau menyediakan fungsionalitas untuk landmark lain.

Untuk meningkatkan fungsi ini dengan Swift di Xcode hari ini, Anda dapat melakukan hal berikut seperti yang dijelaskan oleh Ben Dodson & Jeffrey Sambells:

Tambahkan Run Script baru ke tab fase pembuatan target Anda (pengaturan proyek> build fase> '+'> fase skrip jalankan baru), dan rekatkan kode berikut dalam kotak kosong:

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/"

Ini akan memaksa Xcode untuk menandai peringatan pada waktu kompilasi untuk setiap // TODO:atau // FIXME:komentar yang Anda markup.

Atau, Anda dapat mengubah TAG dengan tag khusus: TAGS="WARNING:"dalam kode di atas yang akan menjaga perilaku default untuk TODO & FIXME dan akan meningkatkan waktu kompilasi peringatan pada setiap komentar yang ditandai sebagai komentar // WARNING:.

http://bendodson.com/weblog/2014/10/02/showing-todo-as-warning-in-swift-xcode-project/ http://jeffreysambells.com/2013/01/31/generate-xcode- peringatan-dari-todo-komentar

EDIT: 18/11/14

@ david-h mengangkat poin yang baik dalam komentarnya. Jika Anda hanya ingin meningkatkan peringatan ini dalam konfigurasi bangunan tertentu, Anda dapat melakukan hal berikut:

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

Atau, Anda bisa menggunakan "Rilis" daripada "Debug" untuk hanya menargetkan membangun produksi.

Kyle G
sumber
Ini adalah solusi sementara yang sangat bagus sampai Apple memperbaikinya :)
SomeGuy
Masalahnya adalah aplikasi saya memiliki dua mode - pengembangan dan produksi. Saya ingin tahu bahwa itu membangun bersih dalam produksi, tetapi saya mendapatkan peringatan dalam pengembangan yang pada dasarnya mengingatkan saya pada mode dev - menggunakan URL yang berbeda, batas waktu, pengaturan lain dll. Saran Arie di atas memungkinkan saya melakukan ini, teknik Anda hanya menandai semuanya. Yang mengatakan, teknik ini pasti ada gunanya jadi saya memilihnya juga!
David H
Ide yang sangat berguna! Terima kasih telah berbagi informasi bermanfaat ini.
Tommy
@kyle Bisakah Anda memberi tahu saya arti perl -p -e "s / ($ TAGS) / peringatan: \ $ 1 /" baris ini
Rocker
3
Berfungsi bagus, namun saya harus menambahkan -type fopsi ke findperintah untuk mengecualikan direktori dari hasil pencarian. Ini seharusnya tidak menjadi masalah bagi kebanyakan orang, tetapi siapa pun yang menggunakan R.swiftpod akan mengalami kesalahan yang sama dengan yang saya miliki karena R.swiftmerupakan direktori
Dan F
156

Edit

Pada Swift 4.2, dukungan tingkat bahasa tersedia untuk peringatan dan kesalahan bangun.

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

Jawaban Asli

Cepat, kotor, dan oh begitu sederhana dan elegan sekaligus.

// Description of what you need to fix

var FIX_ME__🛠🛠🛠: AnyObject

Melemparkan peringatan bahwa 'FIX_ME__🛠🛠🛠' tidak pernah digunakan.

Anda dapat menambahkan emotikon ke nama variabel jika Anda suka ... Saya sering menggunakan 😱 dan 🛠, untuk sesuatu yang benar-benar perlu diperbaiki, saya bahkan mempertimbangkannya 💩. Anda dapat mengganti FIX_ME__dengan apa pun yang Anda inginkan: ALGORITHM_NEEDS_REVIEW, BugID_148, atauJOHNNY_YOU_BROKE_THIS adalah beberapa contoh.

Cepat, tanpa pengaturan, ringkas, dan emotikon bahkan dapat menambahkan humor / kepribadian pada kode Anda. Terkadang solusi yang paling sederhana adalah solusi terbaik.

Jordan Smith
sumber
6
... Mengapa semua suara turun? Ini berfungsi sama baiknya dengan metode lain di sini. Jika Anda tidak memilih, setidaknya berikan alasan, mungkin saya tidak cukup jelas, atau ada yang salah dengan apa yang saya lakukan. Saya ingin tahu apakah ada.
Jordan Smith
16
Ya, saya tidak yakin mengapa ini tidak terunggulkan lagi. Semua solusi lain terlalu rumit.
Simone Manganelli
3
@ZaEeMZaFaR, kompiler kemungkinan besar akan menyingkirkannya. Selain itu, dalam banyak kasus masalah ini akan diperbaiki sebelum dirilis. Dan - bahkan jika karena alasan apa pun, kompiler tidak cukup pintar untuk menyingkirkannya (saya pikir ini sangat tidak mungkin) - 100 vars dalam memori adalah 6,4 kb memori - pada dasarnya tidak ada. Saya rasa Anda tidak memiliki poin valid maaf.
Jordan Smith
4
Saya menggunakan yang lain tetapi beralih untuk menggunakan yang ini. Ini adalah yang paling sederhana dan Anda bahkan dapat memberi diri Anda sedikit pesan yang akan muncul di peringatan, yaitu: let fixMeMakeMeNonOptional: Intmemberi Anda Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it di navigator masalah. Semua solusi lain memberi Anda lebih banyak pesan kesalahan umum.
Nathan Perry
1
@NathanPerry ya, setuju. Menyiapkan beberapa hal kompleks tidak selalu menjadi pilihan, terutama ketika Anda bekerja dalam tim atau di beberapa proyek dll. Plus, solusi sederhana selalu yang terbaik. Saat ini saya hanya menaruh pesan di sampingnya dalam komentar, tetapi apa yang Anda lakukan juga bukan ide yang buruk.
Jordan Smith
81

Posting Pembaruan WWDC 2018

Dimulai dengan Xcode 10 dan Swift 4.2 Anda sekarang dapat menggunakan #warninglagi seperti:

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

Ini akan muncul sebagai peringatan di Xcode seperti yang diharapkan!

Ini berfungsi bahkan dalam kombinasi dengan #ifcek, misalnya yang berikut ini hanya akan menampilkan peringatan jika platform target Anda adalah iOS:

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

Ada juga #errorjika Anda ingin bangunan Anda gagal.


Pra WWDC 2018 Jawaban

Di Swift menggunakan XCode 6 Anda dapat menggunakan berbagai jenis landmark untuk tujuan yang berbeda. Inilah yang dikatakan Apple tentang hal itu:

Xcode sekarang mendukung // MARK :, // TODO: dan // FIXME: landmark untuk membubuhi keterangan kode Anda dan mencantumkannya di bilah lompat.

Jadi untuk mengatur peringatan dengan deskripsi, Anda akan menggunakan sesuatu seperti ini:

//TODO: Clean up this code after testing

Jika Anda hanya ingin menetapkan tanda pendek (dengan asumsi Anda akan ingat apa yang harus dilakukan), gunakan ini:

//FIXME

EDIT: Namun landmark ini hanya muncul di bar lompat XCode yang mungkin bukan yang Anda inginkan dan apa yang diharapkan - terutama dari tanda // TODO: dan // FIXME. Saya telah mengajukan radar tentang itu: # 17776817. Semoga Apple akan menambahkan ini di build mendatang di XCode 6.

SOLUSI (EDIT 2): Jika Anda menginstal Swift Linter via Homebrew (jalankan brew install swiftlintsetelah a brew update) dan menambahkan skrip build yang disarankan ke proyek Anda, maka Anda akan melihat semua landmark Anda TODOdan FIXMEmuncul sebagai peringatan dalam Xcode. SwiftLint bahkan akan menambahkan lebih banyak peringatan / kesalahan yang dapat Anda konfigurasi agar sesuai dengan kebutuhan Anda - saya hanya dapat merekomendasikan menggunakan SwiftLint dan itu memecahkan masalah ini dengan cara yang hebat!

Astaga
sumber
7
Sayangnya ini tidak muncul di panel peringatan ketika Anda mengkompilasi aplikasi Anda. Saya masih menunggu yang menonjol seperti jempol sehingga Anda tidak akan melupakannya. Ini hanya muncul di jumpbar dan Anda harus ingat untuk mencari proyek Anda "// TODO" untuk menemukannya. Atau jika ada yang tahu cara melihatnya untuk seluruh proyek, beri tahu saya. - waktu untuk Radar lain :)
SomeGuy
1
Uh ya, kamu benar. Saya pikir bilah lompat adalah bilah samping di sebelah kiri dan tanda itu akan muncul di Issue Navigator, tetapi tidak. Saya baru saja mengajukan radar tentang itu: # 17776817. :)
Jeehut
@OmeGuy Apa maksudmu dengan mereka muncul di jumpbar? Dari apa yang saya lihat mereka tidak ada di bar yang terletak di bagian atas jendela editor di Xcode. Satu-satunya cara untuk memperhatikan mereka (bagi saya) tampaknya mencari mereka dengan Command + F. Di mana landmark ditampilkan?
almel
2
@almel Jumpbar adalah drop-down di bagian atas file, ia memberikan daftar fungsi dalam file saat ini i.cubeupload.com/jLRwTs.png
SomeGuy
55

Masih belum ditambahkan oleh tim Apple. Apa yang saya putuskan untuk lakukan mungkin curang, tetapi setidaknya itu menunjukkan kepada saya pesan FIXME. Jadi yang saya lakukan adalah mendeklarasikan fungsi FIXME () dalam file Swift:

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

dan ketika saya memanggilnya dari fungsi lain itu tidak menunjukkan peringatan, misalnya

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

masukkan deskripsi gambar di sini

Untuk penggunaan Swift 2

@available(iOS, deprecated=1.0, message="I'm not deprecated, please ***FIXME**")
mengganggu
sumber
2
Sebagai catatan: @ ketersediaan telah diubah namanya menjadi "@ tersedia" dengan cepat 2.
Tobias
42

Lihatlah artikel ini .

Anda dapat menulis skrip Anda sendiri yang akan menyorot semua tag.

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/"

Ini menghasilkan: masukkan deskripsi gambar di sini

kelin
sumber
Tambahkan egrep --directories='skip'untuk mengabaikan direktori dengan nama-nama seperti Device.swift
chunkyguy
12

Sebagai alternatif, jika Anda ingin sesuatu muncul di panel peringatan, Anda dapat menulis sesuatu seperti:

if (false){
   var x = 2;
}

Anda tidak dapat menampilkan teks apa pun, tetapi setidaknya itu adalah penanda yang lebih terlihat, terutama jika Anda cenderung memperlakukan (kebanyakan) peringatan seperti kesalahan.

Arie Litovsky
sumber
11
Atau lakukan saja jika false {"the message message"}
Bao Lei
Solusi ini sangat buruk. Tetapi tampaknya menjadi yang terbaik yang tersedia. Terpilih, terima kasih.
skagedal
6

Saya mengusulkan dan mengimplementasikan fitur ini, dan fitur ini akan dikirimkan bersama Swift 4.2. Anda dapat menggunakannya sekarang dengan mengunduh mastertoolchain di swift.org .

#if os(macOS)
  #error("macOS is not supported")
#endif
#warning("finish this")
Harlan Haskins
sumber
5

Satu CocoaPod yang saya gunakan ada .swiftdi namanya, jadi direktori dikembalikan, yang menyebabkan script oleh Kyle mogok. Menambahkan -type fke findperintah memperbaiki masalah itu dengan hanya melihat file yang cocok*.swift bukan juga kembali direktori yang cocok dengan pola.

Kode terakhir yang saya gunakan:

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/"
sflogen
sumber
1
Apakah ada cara untuk tidak membuat kompiler mengeluh? Saya mendapatkan "Perintah / bin / sh kesalahan yang dipancarkan tetapi tidak mengembalikan kode keluar bukan nol untuk menunjukkan kegagalan"
Chris Paveglio
Sebagai alternatif lihat komentar
chunkyguy
4

Jika Anda enggan untuk menyesuaikan pengaturan bangunan Anda, obat rumah sederhana lainnya adalah menempelkan placeholder editor di depan komentar:

<#todo#>// stop and fixme!

Anda mendapatkan kesalahan "Editor placeholder dalam file sumber" saat membuat, tetapi tidak seperti solusi Jordan, tidak ada kesalahan langsung yang mengganggu Anda saat mengetik:

editor placeholder

Minh Nguyá»…n
sumber
Ide bagus - tetapi bukankah ide untuk memberikan peringatan, dan bukan kesalahan? Melakukan ini tidak akan membiarkan Anda membangun sampai Anda menghapusnya, yang, dalam banyak (kebanyakan?) Kasus jelas bukan yang Anda inginkan. Tanda Todo dan fixme kadang-kadang melibatkan pekerjaan berminggu-minggu - Saya bayangkan Anda ingin membangun dan menjalankan proyek Anda selama waktu ini :)
Jordan Smith
Tentu, itu poin yang bagus. Pendekatan ini hanya berguna untuk hal-hal yang harus dilakukan yang lebih mendesak yang harus terjadi sebelum melakukan atau bahkan menjalankan aplikasi. Manfaat utama adalah bahwa penyorotan sintaksis dan editor editor lainnya terus bekerja meskipun kehadiran placeholder ini. Saya menggunakan beberapa pendekatan lain di sini sendiri, termasuk milik Anda, tetapi placeholder terkadang membantu ketika melakukan banyak tugas. Ini cocok dengan kasus penggunaan yang sama seperti yang disisipkan oleh placeholder Xcode saat melengkapi fungsi secara otomatis.
Minh Nguyá»…n
3

Setelah banyak pencarian dan kerinduan, saya yakin tidak ada entitas seperti itu. Saya masih berharap dengan catatan rilis Xcode terbaru yang menyebutkan masih kurangnya mekanisme tanda #pragma, #warning dan #error juga akan datang.

Selain itu, saya sangat merekomendasikan pengarsipan Radar dengan Apple di bugreport.apple.com untuk menambahkan fungsi ini (Anda dapat menipu 17702491).

rcw3
sumber
1
Saya melakukan bagian saya: rdar: // 19005171
David H
1
Juga diisi dengan radar
HixField
2

Kami menulis alat yang dapat dikonfigurasi yang memungkinkan Anda menaruh peringatan dan kesalahan di Xcode Issue Navigator berdasarkan tag komentar dan membangun konfigurasi: https://github.com/doubleencore/XcodeIssueGenerator

Pasang itu:

brew tap doubleencore/tap
brew install xcodeissuegenerator

Kemudian masukkan baris dalam Fase Pembuatan Skrip Run:

# 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/"

Inilah artikel yang menjelaskan bagaimana kami menggunakannya.

soolwan
sumber
2

Saya mungkin terlambat ke pesta dengan Xcode 10 mendukung kesalahan dan peringatan, tetapi hanya meletakkan String:

"Need to finish implementing this"

akan menghasilkan peringatan: String literal is unuseddengan pelengkapan otomatis masih berfungsi dan proyek masih dikompilasi.

Przemysław Wrzesiński
sumber
1

Jawaban saya tidak cukup memuaskan pertanyaan Anda, tetapi jika Anda ingin sesuatu yang mudah Anda dapat menggunakan ini plugin alcatraz yang bekerja di semua proyek tanpa persiapan tambahan. Lakukan saja yang berikut ini:

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

Itu juga memiliki preferensi untuk menambahkan tag baru

masukkan deskripsi gambar di sini

Nikolay Shubenkov
sumber
1

Keuntungan potongan ini - tidak menunjukkan peringatan dari 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

Bagaimana cara meng-install:

masukkan deskripsi gambar di sini

Igor
sumber