Swift: # uyarı eşdeğeri


192

Swift'in # uyarı eşdeğeri var mı? Sadece Xcode'un kendi GUI'sinde bir uyarı göstermek için kullanılır

Ayrıca #error eşdeğeri olup olmadığıyla da ilgileniyorum.

Apple #Pragma işaretinin yakında çıkacağını söyledi, muhtemelen bununla aynı olabilir.

resim açıklamasını buraya girin


7
Sanırım //WARNING#pragma gibi olacak //MARKama şu anda hiçbiri XCode beta eklenmiş değil.
Lord Zsolt

1
Ben çok sormak için bir radar dosyalama öneririm // UYARI
pixel

@pixel Bir radar dosyası
açtım

Jordan Smith'in cevabını kabul edebilir misiniz? Bu şimdi Swift #warning olarak inşa edilmiştir
Bill

Yanıtlar:


158

Gelecekte, Apple geliştiricileri bir //WARNING:dönüm noktasını çok iyi serbest bırakabilir veya başka bir adlandırılmış dönüm noktası için işlevsellik sağlayabilir.

Ancak bu işlevselliği Swift in Xcode ile bugün kullanmak için, Ben Dodson ve Jeffrey Sambells tarafından belirtildiği gibi şunları yapabilirsiniz:

Hedefinizin oluşturma aşamaları sekmesine yeni bir Çalışma Komut Dosyası ekleyin (proje ayarları> yapı aşamaları> '+'> yeni çalıştırma komut dosyası aşaması) ve aşağıdaki kodu boş kutuya yapıştırın:

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

Bu, Xcode'u işaretlediğiniz herhangi bir yorum // TODO:veya // FIXME:yorum için derleme zamanında bir uyarıyı işaretlemeye zorlar .

Alternatif olarak, TAGS'ı özel bir etiketle değiştirebilirsiniz: TAGS="WARNING:"yukarıdaki kodda TODO & FIXME için varsayılan davranışı koruyacak ve olarak işaretlenen yorumlarda derleme zamanı uyarısı oluşturacaktır // WARNING:.

http://bendodson.com/weblog/2014/10/02/showing-todo-as-warning-in-swift-xcode-project/ http://jeffreysambells.com/2013/01/31/generate-xcode- uyarılar-den-todo-yorumlarla

DÜZENLEME: 18/11/14

@ david-h yorumunda iyi bir noktaya değindi. Bu uyarıları yalnızca belirli bir derleme yapılandırmasında yükseltmek istiyorsanız, aşağıdakileri yapabilirsiniz:

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

Alternatif olarak, yalnızca üretim yapılarını hedeflemek için "Hata Ayıkla" yerine "Yayınla" seçeneğini kullanabilirsiniz.


Apple düzeltene kadar bu çok hoş bir geçici çözüm :)
SomeGuy

Bu sorun, benim app iki modu - geliştirme ve üretim olmasıdır. Üretimde temiz olduğunu bilmek istiyorum, ancak geliştirmede temelde dev modunda olduğumu hatırlatan bir uyarı alıyorum - farklı URL'ler, zaman aşımları, diğer ayarlar vb. Kullanarak. her şeyi işaretler. Bununla birlikte, bu tekniğin kesinlikle kullanımı var, bu yüzden ben de oy verdim!
David H

Ne kadar faydalı bir fikir! Bu yararlı bilgiyi paylaştığınız için teşekkür ederiz.
Tommy

@kyle Lütfen bana perl -p -e "s / ($ TAGS) / Warning 'in anlamını söyler misiniz: \ $ 1 /" bu satır
Rocker

3
Harika çalışıyor, ancak dizinleri sonuçları bulmak dışında bırakmak -type fiçin findkomut seçeneği eklemek zorunda kaldı . Bu çoğu insan için bir sorun olmamalı, ancak R.swiftbölmeyi kullanan herkes sahip olduğum aynı hatayla karşılaşacak çünkü R.swiftbir dizin
Dan F

156

Düzenle

Swift 4.2'den itibaren, hem derleme uyarıları hem de hatalar için dil düzeyinde destek mevcuttur.

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

Orijinal Yanıt

Çabuk, kirli ve aynı anda çok zarif.

// Description of what you need to fix

var FIX_ME__🛠🛠🛠: AnyObject

'FIX_ME__🛠🛠🛠' ifadesinin hiç kullanılmadığına dair bir uyarı atar.

İsterseniz değişken adına ifadeler ekleyebilirsiniz ... Sıklıkla 😱 ve 🛠 kullanıyorum, gerçekten düzeltilmesi gereken bir şey için bile 💩 düşünebilirim. Sen değiştirebilirsiniz FIX_ME__istediğini ile: ALGORITHM_NEEDS_REVIEW, BugID_148, veyaJOHNNY_YOU_BROKE_THIS bazı örneklerdir.

Hızlı, hiçbir kurulum, özlü ve ifadeler bile kodunuza mizah / kişilik ekleyebilir. Bazen en basit çözüm en iyi çözümdür.


6
... Neden aşağı oylar? Bu, buradaki diğer yöntemlerin yanı sıra işe yarıyor. Oy vermiyorsanız, en azından bir neden belirtin, belki yeterince açık değildim, ya da yaptığım şeyde bir sorun var. Var olup olmadığını bilmek isterim.
Jordan Smith

16
Evet, bunun neden daha fazla seçilmediğinden emin değilim. Diğer tüm çözümler çok karmaşıktır.
Simone Manganelli

3
@ZaEeMZaFaR derleyici büyük olasılıkla ondan kurtulur. Ayrıca, çoğu durumda bu sorunlar yayınlanmadan önce çözülecektir. Ve - herhangi bir nedenle, derleyici ondan kurtulmak için yeterince akıllı olmasa bile (bunun çok olası olmadığını düşünüyorum) - 100 Int bellekte 6,4 hafıza var - temelde hiçbir şey. Üzgünüm geçerli bir puanın olduğunu düşünmüyorum.
Jordan Smith

4
Diğerlerini kullandım ama bunu kullanmaya geçtim. Bu en basit olanıdır ve hatta uyarıda görünecek küçük bir mesaj bile verebilirsiniz, yani: let fixMeMakeMeNonOptional: Intsize Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it sorun gezgininde verir . Diğer tüm çözümler size çok daha genel hata mesajları verir.
Nathan Perry

1
@NathanPerry evet, kabul etti. Karmaşık bir şey oluşturmak her zaman bir seçenek değildir, özellikle bir ekipte veya birden fazla projede vb. Çalışırken. Artı, basit çözümler her zaman en iyisidir. Şu anda bir yorumun yanına iletiyi koyuyorum, ama yaptığınız şey de kötü bir fikir değil.
Jordan Smith

81

WWDC 2018 Güncellemesi Sonrası

Xcode 10 ve Swift 4.2 ile başlayarak #warningtekrar şu şekilde kullanabileceksiniz :

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

Bu, Xcode'da beklendiği gibi bir uyarı olarak görünecektir!

Bu, #ifkontrollerle birlikte bile çalışır , örneğin aşağıdakiler yalnızca hedef platformunuz iOS ise bir uyarı gösterir:

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

#errorYapınızın başarısız olmasını istiyorsanız da var .


WWDC 2018 Öncesi Cevap

Swift size kullanabilirsiniz XCode 6 kullanarak farklı farklı amaçlar için yerlerinden türlü. Apple bu konuda şöyle diyor:

Xcode artık kodunuza açıklama eklemek ve atlama çubuğunda listelemek için // MARK :, // TODO: ve // ​​FIXME: yer işaretlerini destekliyor .

Yani bir açıklama içeren bir uyarı ayarlamak için şöyle bir şey kullanırsınız:

//TODO: Clean up this code after testing

Sadece kısa bir işaret ayarlamak istiyorsanız (ne yapacağınızı hatırlayacağınızı varsayarak), bunu kullanın:

//FIXME

DÜZENLEME: Ancak bu yer işaretleri yalnızca XCode'un atlama çubuğunda görünür; bu, ne istediğinizi ve ne olacağını beklemeyebilir - özellikle // TODO: ve // ​​FIXME işaretlerinden. Bunun üzerine bir radar açtım: # 17776817. Umarım Apple bunu XCode 6'daki gelecek yapılara ekleyecektir.

ÇÖZÜM (DÜZENLEME 2): Swift Linter'ı Homebrew aracılığıyla kurarsanız (a'dan brew install swiftlintsonra çalıştırılır brew update) ve önerilen derleme komut dosyasını projenize eklerseniz, tüm TODOve yer FIXMEişaretlerinizin Xcode içinde uyarı olarak göründüğünü göreceksiniz . SwiftLint, ihtiyaçlarınıza uyacak şekilde yapılandırabileceğiniz bazı uyarılar / hatalar bile ekleyecektir - Yalnızca SwiftLint'i kullanmanızı tavsiye edebilirim ve bu sorunu harika bir şekilde çözer!


7
Maalesef bunlar, uygulamanızı derlerken uyarılar panelinde görünmüyor. Hâlâ ağrılı bir başparmak gibi görünen birini bekliyorum, böylece onları unutamazsın. Bunlar sadece atlama çubuğunda görünür ve projenizi bulmak için "// TODO" kelimesini aramayı hatırlamanız gerekir. Ya da herhangi biri projenin tamamı için nasıl göreceğini bilirse, bana bildirin. - başka bir Radar zamanı :)
SomeGuy

1
Ah evet, haklısın. Atlama çubuğunun soldaki yan çubuk olduğunu ve bu işaretlerin Sorun Gezgini'nde görüneceğini düşündüm, ancak görünmüyorlar. Bunun üzerine bir radar açtım: # 17776817. :)
Jeehut

@SomeGuy Bunlar bara çubuğunda gösterdikleri ile ne demek istiyorsun? Ne görebiliyorlar onlar Xcode editör penceresinin üst kısmında bulunan çubuğunda hiçbir yerde vardır. Onları (bana göre) fark etmenin tek yolu Command + F ile onları aramak gibi görünüyor. Yer işaretleri nerede gösteriliyor?
almel

2
@almel Jumpbar, bir dosyanın üst kısmındaki açılır menüdür, geçerli dosyadaki işlevlerin bir listesini verir menüdür i.cubeupload.com/jLRwTs.png
SomeGuy

55

Hala Apple ekibi tarafından eklenmedi. Yapmaya karar verdim muhtemelen bir hile, ama en azından bana bir FIXME mesajı gösteriyor. Yani yaptığım Swift dosyasında FIXME () işlevini bildirmektir:

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

ve başka bir işlevden çağırdığımda bir uyarı gösteriyor, örn.

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

resim açıklamasını buraya girin

Swift 2 kullanımı için

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

2
Sadece kayıt için: @availability, hızlı 2'de "@available" olarak yeniden adlandırıldı
Tobias

42

Şuna bak makaleye bakın .

Tüm etiketleri vurgulayacak kendi komut dosyanızı yazabilirsiniz.

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

Bu sonuç: resim açıklamasını buraya girin


Ekle egrep --directories='skip'gibi isimlerle dizinleri görmezden Device.swift
chunkyguy

12

Alternatif olarak, uyarılar panelinde bir şey görünmesini istiyorsanız, şöyle bir şey yazabilirsiniz:

if (false){
   var x = 2;
}

Gerçekten herhangi bir metin gösteremezsiniz, ancak en azından daha görünür bir işaretçi, özellikle de hatalar gibi (çoğu) uyarıları tedavi etme eğilimindeyseniz.


11
Ya da sadece yanlışsa {"uyarı mesajı"} yapın
Bao Lei

Bu çözüm korkunç. Ancak mevcut en iyi gibi görünüyor. Oy verildi, teşekkürler.
skagedal


5

Kullandığım bir CocoaPod'un .swiftadı vardı , bu yüzden Kyle'ın komut dosyasının çökmesine neden olan bir dizin döndü. Komuta eklemek -type f, findyalnızca eşleşen dosyalara bakarak bu sorunu düzeltir*.swift da kalıpla eşleşen dizinleri dönen yerine.

Kullandığım son kod:

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
Derleyicinin şikayet etmemesinin bir yolu var mı? "Komut / bin / sh yayılan hatalar alıyorum ama hatayı göstermek için sıfır olmayan bir çıkış kodu döndürmedim"
Chris Paveglio

Alternatif olarak yukarıdaki
chunkyguy

4

Derleme kurulumunuzu ayarlamaktan hoşlanmıyorsanız, başka bir basit çözüm de yorumun önüne bir düzenleyici yer tutucusu yapıştırmaktır:

<#todo#>// stop and fixme!

Oluşturduğunuzda "Kaynak dosyada Editör yer tutucu" hatası alıyorsunuz, ancak Jordan'ın çözümünün aksine, yazarken sizi rahatsız edecek canlı bir hata yok:

editör yer tutucu


Güzel fikir - ama uyarı atma fikri değil, hata değil mi? Bunu yapmak, onu kaldırıncaya kadar inşa etmenize izin vermez, bu da çoğu (en çok?) Durumda kesinlikle istediğiniz şey değildir. Todo ve fixme işaretleri bazen haftalarca çalışma gerektirir - projenizi bu süre zarfında inşa etmek ve yürütmek isteyeceğinizi düşünürdüm :)
Jordan Smith

Tabii, bu iyi bir nokta. Bu yaklaşım, yalnızca uygulamayı gerçekleştirmeden ve hatta uygulamayı çalıştırmadan önce yapılması gereken daha acil yapılacaklar için kullanışlıdır. Başlıca faydası, bu yer tutucunun varlığına rağmen sözdizimi vurgulama ve diğer editör ayrıntılarının çalışmaya devam etmesidir. Burada sizinkiler de dahil olmak üzere diğer bazı yaklaşımları kullanıyorum, ancak yer tutucular bazen çoklu görev yaparken yardımcı oluyorlar. Bir işlev çağrısını otomatik olarak tamamlarken yer tutucu Xcode'un eklediği kullanım durumlarıyla aynıdır.
Minh Nguyễn

3

Çok araştırma ve özlemden sonra, böyle bir varlığın olmadığına ikna oldum. Hala #pragma mark mekanizması eksikliği devam eden en son Xcode sürüm notları ile umutluyum, #warning ve #error da geliyor olabilir.

Bir kenara, ben çok az Apple ile bir Radar dosyalama tavsiye olarak bugreport.apple.com bu işlevselliği eklemek için (eğer 17702491 dupe olabilir).


1
Rolümü yaptım: rdar: // 19005171
David H

1
Ayrıca bir radarla doldurulmuş
HixField

2

Yorum etiketine ve derleme yapılandırmasına dayalı olarak Xcode Issue Navigator'a uyarı ve hatalar koymanıza izin veren yapılandırılabilir bir araç yazdık: https://github.com/doubleencore/XcodeIssueGenerator

Yükle:

brew tap doubleencore/tap
brew install xcodeissuegenerator

Sonra Run Script Build Phase'a bir satır ekleyin:

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

İşte onu nasıl kullandığımızı açıklayan bir makale .


2

Hataları ve uyarıları destekleyen Xcode 10 ile partiye geç olabilirim, ama sadece bir String koyarak:

"Need to finish implementing this"

bir uyarı üretecektir: String literal is unusedotomatik tamamlama hala çalışıyor ve proje hala derleniyor.


1

Cevabım sorunuzu tam olarak karşılamıyor, ancak kolay bir şey istiyorsanız, herhangi bir ek hazırlık yapmadan tüm projelerde çalışan bu alcatraz eklentisini kullanabilirsiniz . Sadece aşağıdakileri yapın:

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

Ayrıca yeni etiketler ekleme tercihleri ​​de var

resim açıklamasını buraya girin


1

Bu snippet'in avantajı - Bölmelerden gelen uyarıları göstermez:

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

Nasıl kurulur:

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.