कैसे तेज में एक चेतावनी चुप्पी के लिए


98

मेरे पास एक कोड है जो बहुत सारी चेतावनियाँ पैदा कर रहा है (अपग्रेड किया गया एपीआई)

क्लेंग का उपयोग करना * मैं कर सकता था

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    ...
#pragma clang diagnostic pop

हालाँकि यह स्विफ्ट में काम नहीं करता है।

इसे स्विफ्ट में कैसे करें?

नोट: मैं चेतावनी को वैश्विक रूप से अक्षम नहीं करना चाहता, न ही विस्तृत फ़ाइल करना चाहता हूं, बल्कि अपने स्रोत कोड के विशिष्ट भाग में एक विशिष्ट चेतावनी को अक्षम करना चाहता हूं।

संपादित करें: मुझे लगता है कि मेरा नोट पर्याप्त रूप से स्पष्ट नहीं था: मैं सशर्त संकलन नहीं चाहता हूं (जो माना जाता है कि डुप्लिकेट का प्रस्तावित उत्तर है)। मैं सिर्फ नए एपीआई का उपयोग किए बिना एक चेतावनी को चुप करना चाहता हूं।



4
यह कोई डुप्लिकेट नहीं है। अन्य प्रश्न इस समस्या का उत्तर देने में विफल है।
क्लॉस जोर्जेंसन

@ ClausJørgensen किस तरह से इस समस्या का जवाब देने में विफल है? लिंक किए गए प्रश्न के उत्तर में कोई अन्य तरीका नहीं है। बस सशर्त संकलन या नया #availableमैक्रो जहां डेवलपर को नए तरीकों का उपयोग करना चाहिए और यदि नए उपलब्ध नहीं हैं तो पुराने को कम करना चाहिए।

@robertvojta नहीं, जैसा कि उत्तर देता है, वास्तव में, यह नहीं बताता कि चेतावनी देने के लिए कोई अन्य तरीका नहीं है।
क्लॉस जोर्जेंसन

2
यह एक धोखा नहीं है। उस स्थिति के बारे में क्या है जहाँ आपको एक इनिशियलाइज़र गुम होने की चेतावनी दी जाती है?
NSTJ

जवाबों:


157

2020 तक, Xcode 12.0, आम सहमति यह है कि इसे प्राप्त करने का कोई तरीका नहीं है।

मैं इस उत्तर को अपडेट / संपादित करता / करती हूँ अगर Apple फीचर जोड़ें।

इसे WWDC 2021 के लिए अपनी इच्छा सूची में रखें!


21
लानत है, कि एक bummer है। यह कभी-कभी हाथ से निकल जाता है । यह कम से कम कहने के लिए कष्टप्रद है।
इस्सरू

2
मैं एक लाख बार इस जवाब को वोट देना चाहता हूं, लेकिन यह बहुत अच्छी तरह से सवाल का जवाब देता है +1 :-)
डेडबीफ

3
@Isuru उस बिंदु पर मैं बस पूरी बात के पुनर्निर्माण के लिए पर्याप्त चिढ़ हो जाएगा। चेतावनी दी
सायरन

1
@ इस्सुरे को ज्यादातर को नजरअंदाज नहीं किया जाना चाहिए।
केविन

3
कितना निराशाजनक! इस उत्तर को अपडेट रखने के लिए धन्यवाद।
डैन लोवेनहेर्ज़

48

स्विफ्ट में डिप्रेसन चेतावनियों के लिए कोई सामान्य निर्माण नहीं है, लेकिन एक वर्कअराउंड है जिसे कई मामलों में लागू किया जा सकता है

मान लीजिए कि आपके पास getLatestImage()कक्षा पर एक विधि है Fooजो कि पदावनत विधियों / कक्षाओं का उपयोग करती है।

विधि के अंदर@available सभी चेतावनियों को चुप कराने के लिए डैनियल थोर्प के रूप में उपयोग करें :

@available(iOS, deprecated: 9.0)
func getLatestImage() -> UIImage? {
    ...
}

अब आप पदावनति की चेतावनी के बिना विधि को कॉल करना चाहेंगे getLatestImage()। आप पहले एक प्रोटोकॉल और एक विस्तार को परिभाषित करके प्राप्त कर सकते हैं:

private protocol GetLatestImage {
    func getLatestImage() -> UIImage?
}
extension Foo: GetLatestImage {}

और फिर एक पदावनति चेतावनी के बिना विधि को बुलाओ (यदि fooयह एक उदाहरण है Foo):

(foo as GetLatestImage).getLatestImage() // no deprecation warning

इसका परिणाम यह है कि आपके पास स्विफ्ट कोड है जो बिना किसी डिप्रेशन चेतावनियों के अपग्रेड किए गए एपीआई का उपयोग करता है।


कितनी होशियार। बुराई की तरह? :) लेकिन बहुत अच्छा। एक उपयोग के मामले के लिए ग्रेट जैसे एड्रेसबुक फ्रेमवर्क के कुछ पहलुओं के चल रहे उपयोग पर चेतावनी को दबा दिया गया है जो हटाए गए हैं, लेकिन एक प्रतिस्थापन वास्तव में अभी तक सभी आवश्यक कार्यक्षमता प्रदान नहीं करता है। धन्यवाद।
डंकन बैबेज

4
यदि यह काम करता है, तो मैं आपको अपने पसंदीदा पेय का छह पैक भेजूंगा। आपके पास एक उत्कृष्ट दिमाग है सर, धन्यवाद।
जॉन

@ जॉन तरह के शब्दों के लिए धन्यवाद! यह काम करता है, मुझे इसके साथ आना था क्योंकि हम चेतावनी को हमारे कोडबेस में त्रुटियों के रूप में मानते हैं, और एक खंड अभी भी एक पदावनत पुस्तकालय का उपयोग कर रहा है।
तम्मो फ्रीज

1
@ क्या तुमने उसे सिक्स पैक भेजा है? : पी यह कमाल है। प्रतिभा। धन्यवाद।
बारां इम्रे

तुम एक दुष्ट प्रतिभा हो।
क्रिप्ट

37

दरअसल, आप इन चेतावनियों को एनक्लोजिंग लॉजिकल स्ट्रक्चर (यानी फंक्शन / टाइप) में इस्तेमाल करके दबा सकते हैं@available

उदाहरण के लिए, मान लें कि आपके पास कुछ कोड है जो एड्रेसबुक फ्रेमवर्क का उपयोग करता है, लेकिन आप iOS 9 के खिलाफ निर्माण कर रहे हैं।

@available(iOS, deprecated: 9.0)
func addressBookStatus() -> ABAuthorizationStatus {
    return ABAddressBookGetAuthorizationStatus()
}

Xcode 7.0.1 के रूप में यह इनलाइन चेतावनियों को प्रदर्शित होने से रोकेगा।


6
हां, लेकिन आप अपने फोन करते समय एक ही चेतावनी देखेंगे addressBookStatus()... कि आप पदावनत के रूप में चिह्नित करते हैं।
वैलेंटाइन शेरिन

3
प्रो टिप: यदि आप एक पूरे वर्ग के लिए यह मौन करने चाहते हैं तो बस (पूर्व अपनी कक्षा बयान ऊपर इस पिल्ला स्लैम class ViewController: UIViewController)
सायरन

2
@ सीन्स तब आपको हर बार जब आप इस क्लास को बुलाएंगे तो आपको यह चेतावनी दिखाई देगी at (कम से कम Xcode 8 के साथ)
अलेक्जेंडर वासिनिन

क्या कोई इस फिक्स के साथ सभी पदावनत चेतावनी को चुप कराने में सफल रहा ? मैं उनकी संख्या को घटाकर सिर्फ एक करने में सक्षम था , लेकिन मुझे पिछले एक से छुटकारा पाने का कोई रास्ता नहीं दिख रहा है। कोई सुझाव?
अलेक्जेंडर वासेनिन

1
तो मैं "CGFloat.NativeType '(उर्फ' डबल ') से असंबंधित प्रकार' फ़्लोट 'को हमेशा विफल होने पर" चेतावनी देने के लिए इसका उपयोग कैसे करता हूं " जब मैं कर रहा हूं if CGFloat(0).native is Float { … }? उत्तर: मैंने इसका उपयोग नहीं किया क्योंकि आपने प्रश्न का उत्तर नहीं दिया था।
स्लिप डी। थॉम्पसन

1

हालांकि अभी के लिए स्विफ्ट में डिप्रेसेशन चेतावनियों को चुप करने का कोई तरीका नहीं है, तकनीकी रूप से आप हेडर फ़ाइल को संपादित करके किसी विशेष प्रतीक के लिए कर सकते हैं।

  • पदावनत प्रतीक नाम की प्रतिलिपि बनाएँ
  • File> का चयन करेंOpen Quickly
  • प्रतीक को दबाएं और दबाएं Enter

    सुनिश्चित करें कि स्विफ्ट आइकन ओपन क्विकली बॉक्स में अक्षम है

  • File> का चयन करेंShow in Finder

  • यदि आवश्यक हो तो संपादन की अनुमति देने के लिए फ़ाइल अनुमतियां बदलें
  • प्रतीक के लिए पदावनत मैक्रो संपादित करें। संदर्भ के लिए आसपास के एपीआई देखें। उदाहरण के लिए:

__OSX_AVAILABLE_BUT_DEPRECATED (__ MAC_10_6, __MAC_10_10, __IPHONE_3_0, __IPHONE_8_0)

साथ में

__OSX_AVAILABLE_STARTING (__ MAC_10_6, __IPHONE_3_0)

अब एक कम विचलित करने वाली चेतावनी है जिसके बारे में आप कुछ नहीं कर सकते।

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

आप किसी भी डाउनसाइड के साथ आ सकते हैं तो कृपया टिप्पणी करें।


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