स्विफ्ट: #warning समकक्ष


192

क्या स्विफ्ट में # एवरिंग बराबर है? इसका उपयोग केवल Xcode के अपने GUI में चेतावनी दिखाने के लिए किया जाता है

मुझे इस बात में भी दिलचस्पी है कि क्या कोई # बराबर बराबर है।

Apple ने कहा है कि #pragma चिह्न जल्द ही आ रहा है, यह संभवतः इसके साथ भी ऐसा ही हो सकता है।

यहां छवि विवरण दर्ज करें


7
मुझे लगता है कि यह //WARNINGवैसे ही होगा जैसे #pragma होगा //MARKलेकिन वर्तमान में XCode बीटा में दोनों को नहीं जोड़ा गया है।
लॉर्ड ज़सोल्ट

1
मैं अत्यधिक सुझाव देने के लिए एक रडार दाखिल करने का सुझाव दूंगा // WARNING
पिक्सेल

@pixel मैंने
बजे

क्या आप जॉर्डन स्मिथ के जवाब को स्वीकार कर सकते हैं? इसे अब स्विफ्ट में #warning
Bill

जवाबों:


157

भविष्य में, ऐप्पल देव बहुत अच्छी तरह से एक //WARNING:लैंडमार्क जारी कर सकते हैं , या किसी अन्य नामित लैंडमार्क के लिए कार्यक्षमता प्रदान कर सकते हैं।

हालांकि आज Xcode में स्विफ्ट के साथ इस कार्यक्षमता को बढ़ाने के लिए, आप बेन डोडसन और जेफरी साम्बेल्स द्वारा उल्लिखित निम्न कार्य कर सकते हैं:

अपने लक्ष्य के बिल्ड चरणों टैब में एक नई रन स्क्रिप्ट जोड़ें (प्रोजेक्ट सेटिंग्स> बिल्ड चरण> '+'> नया रन स्क्रिप्ट चरण), और खाली बॉक्स में निम्न कोड चिपकाएँ:

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

यह Xcode को आपके द्वारा चिह्नित किए गए किसी भी टिपण्णी // TODO:या संकलन के लिए चेतावनी देने के लिए मजबूर करेगा // FIXME:

वैकल्पिक रूप से, आप TAGS को एक कस्टम टैग के साथ संशोधित कर सकते हैं: TAGS="WARNING:"उपरोक्त कोड में जो TODO और FIXME के ​​लिए डिफ़ॉल्ट व्यवहार रखेगा और चिह्नित किए गए किसी भी टिप्पणी पर एक संकलन समय चेतावनी देगा // WARNING:

http://bendodson.com/weblog/2014/10/02/showing-todo-as-warning-in-swift-xcode-project/ http://jeffreysambells.com/2013/01/31/generate-xcode- चेतावनी-से-कार्य करने-टिप्पणियां

EDIT: 18/11/14

@ david-h ने अपनी टिप्पणी में एक अच्छी बात उठाई। यदि आप किसी विशिष्ट बिल्ड कॉन्फ़िगरेशन में केवल इन चेतावनियों को उठाना चाहते हैं, तो आप निम्न कार्य कर सकते हैं:

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

वैकल्पिक रूप से, आप केवल उत्पादन को लक्षित करने के लिए "डीबग" के बजाय "रिलीज़" का उपयोग कर सकते हैं।


यह एक बहुत अच्छा अस्थायी समाधान है जब तक कि Apple इसे ठीक नहीं करता है :)
SomeGuy

इसके साथ समस्या यह है कि मेरे ऐप के दो मोड हैं- विकास और उत्पादन। मैं जानना चाहता हूं कि यह उत्पादन में स्वच्छ बनाता है, लेकिन मुझे विकास में एक चेतावनी मिलती है जो अनिवार्य रूप से मुझे याद दिलाती है कि मैं देव मोड में हूं - विभिन्न URL, टाइमआउट, अन्य सेटिंग्स आदि का उपयोग करके। Arie के ऊपर दिए गए सुझाव मुझे ऐसा करने की अनुमति देते हैं, आपकी तकनीक बस झंडे सब कुछ। उस ने कहा, इस तकनीक का उपयोग सुनिश्चित करने के लिए किया गया है इसलिए मैंने इसे वोट दिया!
डेविड एच

क्या उपयोगी विचार है! यह उपयोगी जानकारी साझा करने के लिए आपको धन्यवाद।
टॉमी

@kyle क्या आप मुझे perl -p -e "s ($ TAGS) / चेतावनी का अर्थ बता सकते हैं: \ $ 1 /" यह पंक्ति
Rocker

3
महान काम करता है, हालांकि मुझे खोज परिणामों से निर्देशिकाओं को बाहर -type fकरने के लिए findकमांड में विकल्प जोड़ना पड़ा । यह ज्यादातर लोगों के लिए एक समस्या नहीं होनी चाहिए, लेकिन जो कोई भी R.swiftफली का उपयोग करता है वह उसी त्रुटि में चलेगा जो मेरे पास थी क्योंकि R.swiftएक निर्देशिका है
Dan F

156

संपादित करें

स्विफ्ट 4.2 के रूप में, भाषा स्तर का समर्थन निर्माण चेतावनी और त्रुटियों दोनों के लिए उपलब्ध है।

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

मूल उत्तर

त्वरित, गंदे, और ओह इतने सुरुचिपूर्ण ढंग से एक ही समय में सरल।

// Description of what you need to fix

var FIX_ME__🛠🛠🛠: AnyObject

चेतावनी देता है कि 'FIX_ME__ a' का उपयोग कभी नहीं किया गया था।

यदि आपको पसंद है तो आप चर नाम में इमोटिकॉन्स जोड़ सकते हैं ... मैं अक्सर 🛠 और ons का उपयोग करता हूं, कुछ के लिए जो वास्तव में फिक्सिंग की आवश्यकता होती है मैं भी ons पर विचार करता हूं। आप बदल सकते हैं FIX_ME__आप जो कुछ भी चाहते हैं के साथ: ALGORITHM_NEEDS_REVIEW, BugID_148, या JOHNNY_YOU_BROKE_THISकुछ उदाहरण हैं।

त्वरित, कोई सेटअप, संक्षिप्त और इमोटिकॉन्स भी आपके कोड में हास्य / व्यक्तित्व नहीं जोड़ सकते हैं। कभी-कभी सबसे सरल समाधान सबसे अच्छा समाधान होता है।


6
... क्यों सभी नीचे वोट? यह काम करता है और साथ ही यहाँ किसी भी अन्य तरीके से। यदि आप मतदान कर रहे हैं, तो कम से कम एक कारण बताएं, हो सकता है कि मैं पर्याप्त स्पष्ट नहीं था, या मैं जो कर रहा हूं उसमें कुछ गड़बड़ है। अगर वहाँ है मुझे जानना अच्छा लगेगा।
जॉर्डन स्मिथ

16
हाँ, मुझे यकीन नहीं है कि यह अधिक क्यों नहीं उतारा गया है। अन्य सभी समाधान भी जटिल हैं।
सिमोन मांगनेली

3
@ZaEeMZaFaR संकलक को बहुत संभवत: इससे छुटकारा मिल जाएगा। इसके अलावा, ज्यादातर मामलों में ये मुद्दे रिलीज से पहले ही तय हो जाएंगे। और - भले ही किसी भी कारण से, संकलक स्मार्ट नहीं है इसे से छुटकारा पाने के लिए (मुझे लगता है कि यह बहुत संभावना नहीं है) - स्मृति में 100 इंट संस्करण स्मृति का 6.4kb है - मूल रूप से कुछ भी नहीं। मुझे नहीं लगता कि आपको कोई मान्य बिंदु खेद हुआ है।
जॉर्डन स्मिथ

4
मैंने दूसरों का उपयोग किया लेकिन इस एक का उपयोग करने के लिए स्विच किया गया। यह सबसे सरल है और आप अपने आप को थोड़ा सा संदेश भी दे सकते हैं जो चेतावनी में दिखाई देगा, अर्थात: let fixMeMakeMeNonOptional: Intआपको Immutable value fixMeMakeMeNonOptional was never used; consider replacing with _ or removing it मुद्दा नाविक में देता है । अन्य सभी समाधान आपको बहुत अधिक सामान्य त्रुटि संदेश देते हैं।
नाथन पेरी

1
@NathanPerry हाँ, सहमत हुए। कुछ जटिल चीज़ों को सेट करना हमेशा एक विकल्प नहीं होता है, खासकर जब आप किसी टीम में या कई प्रोजेक्ट्स आदि पर काम करते हैं, इसके अलावा, सरल समाधान हमेशा सबसे अच्छे होते हैं। मैं वर्तमान में केवल एक टिप्पणी में इसके बगल में संदेश रखता हूं, लेकिन आप जो भी करते हैं वह एक बुरा विचार नहीं है।
जॉर्डन स्मिथ

81

डब्ल्यूडब्ल्यूडीसी 2018 अपडेट करें

Xcode 10 और Swift 4.2 से शुरू होकर अब आप #warningफिर से उपयोग कर पाएंगे :

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

यह उम्मीद के मुताबिक Xcode में एक चेतावनी के रूप में दिखाई देगा!

यह #ifचेकों के साथ संयोजन में भी काम करता है, उदाहरण के लिए निम्नलिखित केवल एक चेतावनी दिखाएगा यदि आपका लक्ष्य प्लेटफॉर्म iOS है:

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

वहाँ भी है #errorकि अगर आप अपने निर्माण विफल करना चाहते हैं।


पूर्व WWDC 2018 उत्तर

स्विफ्ट में XCode 6 का उपयोग कर आप उपयोग कर सकते हैं विभिन्न विभिन्न प्रयोजनों के लिए स्थलों के प्रकार। यहाँ एप्पल इसके बारे में क्या कहता है:

Xcode अब // MARK :, // TODO: और // FIXME का समर्थन करता है: आपके कोड को एनोटेट करने के लिए स्थल और उन्हें जंप बार में सूचीबद्ध करता है।

इसलिए विवरण के साथ चेतावनी सेट करने के लिए आप कुछ इस तरह का उपयोग करेंगे:

//TODO: Clean up this code after testing

यदि आप केवल एक छोटा चिह्न सेट करना चाहते हैं (यह मानते हुए कि आपको याद होगा कि क्या करना है), इसका उपयोग करें:

//FIXME

EDIT: हालांकि ये जगहें केवल XCode के जंप बार में दिखाई देती हैं, जो हो सकता है कि आप क्या चाहते हैं और किसी को क्या उम्मीद होगी - विशेष रूप से // TODO: और // FIXME अंकों से। मैंने उस पर एक राडार दर्ज किया है: # 17776817। उम्मीद है कि Apple XCode 6 में आने वाले बिल्ड में इसे जोड़ देगा।

समाधान (EDIT 2): यदि आप Homebrew के माध्यम से स्विफ्ट लाइनर स्थापित करते हैं ( brew install swiftlintएक के बाद भागो brew update) और अपने प्रोजेक्ट में सुझाई गई बिल्ड स्क्रिप्ट जोड़ें , तो आप देखेंगे कि आपके सभी TODOऔर FIXMEस्थल Xcode के भीतर चेतावनी के रूप में दिखाई देंगे। SwiftLint भी कुछ और चेतावनियाँ / त्रुटियाँ जोड़ेगा जिन्हें आप अपनी आवश्यकताओं के अनुसार कॉन्फ़िगर कर सकते हैं - मैं केवल SwiftLint का उपयोग करने की सिफारिश कर सकता हूँ और यह इस समस्या को एक शानदार तरीके से हल करता है!


7
जब आप अपना ऐप संकलित करते हैं तो दुर्भाग्य से ये चेतावनी पैनल में दिखाई नहीं देते हैं। मैं अभी भी एक के लिए इंतजार कर रहा हूँ जो एक गले में अंगूठे की तरह चिपक जाता है ताकि आप उनके बारे में भूल जाने की संभावना न करें। ये सिर्फ जंपबार में दिखाई देते हैं और आपको इसे खोजने के लिए "// TODO" के लिए अपने प्रोजेक्ट को खोजने के लिए याद रखना होगा। या अगर कोई जानता है कि उन्हें पूरे प्रोजेक्ट के लिए कैसे देखना है, तो मुझे बताएं। - एक और रडार के लिए समय :)
SomeGuy

1
उह, तुम सही हो। मुझे लगा कि जंप बार बाईं तरफ की साइड बार है और यह अंक इश्यू नेविगेटर पर दिखाई देंगे, लेकिन वे नहीं करते हैं। मैंने अभी उस पर एक राडार दर्ज किया है: # 17776817। :)
जेहुत

@SomeGuy क्या मतलब है कि वे जंपबार में दिखते हैं? जो मैं देख सकता हूं, वे उस समय पर नहीं हैं जहां बारकोड में संपादक विंडो के शीर्ष पर स्थित है। उन्हें (मेरे लिए) नोटिस करने का एकमात्र तरीका कमांड + एफ के साथ उनकी खोज करना प्रतीत होता है जहां गंतव्य दिखाए गए हैं?
अलम जूल

2
@almel जंपबार एक फ़ाइल के शीर्ष पर ड्रॉप डाउन है, यह वर्तमान फ़ाइल में कार्यों की एक सूची देता है i.cubeupload.com/jLRwTs.png
SomeGuy

55

अभी भी Apple टीम द्वारा अभी तक नहीं जोड़ा गया है। मैंने जो करने का फैसला किया, वह शायद एक धोखा है, लेकिन कम से कम यह मुझे एक FIXME संदेश दिखाता है। तो मैं क्या करता स्विफ्ट फ़ाइल में FIXME () फ़ंक्शन की घोषणा करता है:

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

और जब मैं इसे किसी अन्य फ़ंक्शन से कॉल करता हूं तो यह एक चेतावनी दिखाता है, जैसे

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

यहां छवि विवरण दर्ज करें

स्विफ्ट 2 उपयोग के लिए

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

2
बस रिकॉर्ड के लिए: @ उपलब्धता का नाम बदलकर "@ अनुपलब्ध" स्विफ्ट में किया गया है
तोबियास

42

इस लेख को देखें

आप अपनी खुद की स्क्रिप्ट लिख सकते हैं जो सभी टैग को उजागर करेगा।

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'जैसे नामों के साथ निर्देशिका की अनदेखी करने के Device.swift
chunkyguy

12

एक विकल्प के रूप में, यदि आप चेतावनी पैनल में कुछ दिखाना चाहते हैं, तो आप कुछ ऐसा लिख ​​सकते हैं:

if (false){
   var x = 2;
}

आपको दिखाने के लिए वास्तव में कोई पाठ नहीं मिल सकता है, लेकिन कम से कम यह एक अधिक दृश्यमान मार्कर है, खासकर यदि आप त्रुटियों की तरह (अधिकांश) चेतावनियों का इलाज करते हैं।


11
या बस अगर झूठ {"चेतावनी संदेश"}
बाओ लेई

यह समाधान भयानक है। लेकिन लगता है सबसे अच्छा उपलब्ध है। वोट दिया, धन्यवाद।
Skagedal


5

एक कोकोआपोड जो मैं उपयोग कर रहा था .swift, उसके नाम में था , इसलिए एक निर्देशिका वापस कर दी गई, जिससे काइल द्वारा स्क्रिप्ट को क्रैश कर दिया गया। जोड़ने -type fके लिए findआदेश फिक्स है कि केवल फाइलों से मेल खाने वाले को देखकर समस्या *.swiftभी निर्देशिका है कि आकार से मिलान लौटने के बजाय।

अंतिम कोड जिसका मैंने उपयोग किया:

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
क्या कंपाइलर की शिकायत नहीं करने का कोई तरीका है? मुझे "कमांड / बिन / श उत्सर्जित त्रुटियां मिलती हैं, लेकिन विफलता को इंगित करने के लिए एक
नॉनजेरो

एक विकल्प के रूप में इस टिप्पणी को ऊपर
chunkyguy

4

यदि आप अपने बिल्ड सेटअप को समायोजित करने के लिए घृणा करते हैं, तो एक और सरल घरेलू उपाय एक संपादक प्लेसहोल्डर को टिप्पणी के सामने रखना है:

<#todo#>// stop and fixme!

जब आप निर्माण करते हैं, तो आपको "स्रोत फ़ाइल में संपादक प्लेसहोल्डर" त्रुटि मिलती है, लेकिन जॉर्डन के समाधान के विपरीत, कोई लाइव त्रुटि नहीं है जो आपको परेशान करती है।

संपादक प्लेसहोल्डर


अच्छा विचार - लेकिन एक चेतावनी फेंकने के लिए विचार नहीं है, और एक त्रुटि नहीं है? ऐसा करने से आप इसे तब तक नहीं बनने देंगे जब तक कि आप इसे हटा नहीं देते, जो कि कई (सबसे?) मामलों में निश्चित रूप से वह नहीं है जो आप चाहते हैं। टोडो और फ़िक्मे के निशान कभी-कभी हफ्तों के काम के लायक होते हैं - मुझे लगता है कि आप इस समय के दौरान अपनी परियोजना बनाना और चलाना चाहते होंगे :)
जॉर्डन स्मिथ

ज़रूर, यह एक अच्छी बात है। यह तरीका केवल अधिक जरूरी टू-डू आइटम के लिए उपयोगी है जो कि कमिट करने या एप्लिकेशन चलाने से पहले होना चाहिए। मुख्य लाभ यह है कि इस प्लेसहोल्डर की उपस्थिति के बावजूद सिंटैक्स हाइलाइटिंग और अन्य संपादक निकेट्स काम करना जारी रखते हैं। मैं यहां कुछ अन्य दृष्टिकोणों का उपयोग खुद करता हूं, जिनमें आपका भी शामिल है, लेकिन प्लेसहोल्डर कभी-कभी मल्टीटास्किंग करते समय सहायक होते हैं। यह एक ही उपयोग के मामलों को फिट बैठता है जब प्लेसहोल्डर Xcode आवेषण करता है जब एक फ़ंक्शन कॉल को स्वतः पूर्ण करता है।
मिन्ह गुयेन

3

बहुत खोज और लालसा के बाद, मुझे यकीन है कि ऐसी कोई इकाई मौजूद नहीं है। मैं अभी भी उम्मीद कर रहा हूँ कि नवीनतम Xcode रिलीज़ नोटों में #pragma मार्क तंत्र की निरंतर कमी का उल्लेख है, #warning और #error भी आ सकते हैं।

एक अलग रूप में, मैं अत्यधिक में एप्पल के साथ एक रडार दाखिल की सिफारिश के रूप में bugreport.apple.com इस कार्यक्षमता जोड़ने के लिए (आप 17,702,491 को धोखा कर सकते हैं)।


1
मैंने अपना हिस्सा किया: rdar: // 19005171
डेविड एच

1
एक रडार में भी भरे
HixField

2

हमने एक कॉन्फ़िगर करने योग्य उपकरण लिखा है जो आपको टिप्पणी टैग और बिल्ड कॉन्फ़िगरेशन के आधार पर Xcode इश्यू नेविगेटर में चेतावनी और त्रुटियां डालने देता है: https://github.com/doubleencore/XcodeIssueGenerator

इसे स्थापित करो:

brew tap doubleencore/tap
brew install xcodeissuegenerator

फिर एक रन स्क्रिप्ट बिल्ड चरण में एक पंक्ति डालें:

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

यहां बताया गया है कि हम इसका उपयोग कैसे करते हैं।


2

मैं Xcode 10 समर्थन त्रुटियों और चेतावनियों के साथ पार्टी के लिए देर से हो सकता हूं, लेकिन बस एक स्ट्रिंग डाल रहा हूं:

"Need to finish implementing this"

एक चेतावनी का उत्पादन करेगा: String literal is unusedस्वत : पूर्णता के साथ अभी भी काम कर रहा है और परियोजना अभी भी संकलन कर रही है।


1

मेरा उत्तर आपके प्रश्न को पूरी तरह से संतुष्ट नहीं करता है, लेकिन यदि आप कुछ आसान चाहते हैं तो आप एल्काट्राज के इस प्लगइन का उपयोग कर सकते हैं जो बिना किसी अतिरिक्त तैयारी के सभी परियोजनाओं में काम करता है। बस निम्नलिखित करें:

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

इसमें नए टैग जोड़ने की प्राथमिकताएँ भी हैं

यहां छवि विवरण दर्ज करें


1

इस स्निपेट का लाभ - यह पॉड्स से चेतावनी नहीं दिखाता है:

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

स्थापित कैसे करें:

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.