Xcode में किसी विधि को कैसे दर्शाया जाए


79

हमारे पास हमारी लाइब्रेरी है जिसे हम अपने ग्राहकों को भेजते हैं, और मैं कुछ तरीकों को "पदावनत" के रूप में चिह्नित करना चाहता हूं क्योंकि हमने उन्हें बदल दिया था (जैसे कि Apple iPhone एसडीके में करता है)।

मैंने __OSX_AVAILABLE_BUT_DEPRECATEDप्री-प्रोसेसर मैक्रो देखा है, जिसे मैप किया जाता है __AVAILABILITY_INTERNAL, जिसे मैप किया जाता है __attribute__((deprecated))...

वैसे मैं इस सामान के साथ थोड़ा उलझन में हूँ!

किसी को उसके बारे में कुछ पता है?

जवाबों:


150

__attribute__((deprecated))एक पद / विधि को पदावनत करने के लिए gcc तरीका ( क्लैंग में समर्थित ) भी है । जब किसी को "पदावनत" के रूप में चिह्नित किया जाता है, तो जब भी कोई भी इसे बुलाएगा, एक चेतावनी का उत्पादन किया जाएगा।

सामान्य कार्यों के लिए वाक्यविन्यास होगा

__attribute__((deprecated))
void f(...) {
  ...
}

// gcc 4.5+ / clang
__attribute__((deprecated("g has been deprecated please use g2 instead")))
void g(...) {
  ...
}

और उद्देश्य-सी के तरीके होंगे

@interface MyClass : NSObject { ... }
-(void)f:(id)x __attribute__((deprecated));
...
@end

आप पूरे वर्ग को भी चिह्नित कर सकते हैं

__attribute__((deprecated))
@interface DeprecatedClass : NSObject { ... }
...
@end

Apple <AvailabilityMacros.h>हेडर भी प्रदान करता है जो DEPRECATED_ATTRIBUTE और DEPRECATED_MSG_ATTRIBUTE (msg) मैक्रोज़ प्रदान करता है जो उपरोक्त विशेषताओं का विस्तार करते हैं, या यदि कंपाइलर विशेषताओं का समर्थन नहीं करता है तो कुछ भी नहीं। ध्यान दें कि यह हेडर OS X / iOS के बाहर मौजूद नहीं है।


साइड नोट, यदि आप स्विफ्ट का उपयोग कर रहे हैं तो आप आइटम का उपयोग करने के लिए @availableविशेषता का उपयोग करते हैं , उदाहरण के लिए

@available(*, deprecated=2.0, message="no longer needed")
func f() {
    ...
}

इस तेजी से उत्तर के लिए धन्यवाद, मुझे पूरा यकीन है कि यह मदद करेगा, मैंने पूछने से पहले थोड़ी देर के लिए खोज की :)
जुलिएन

1
मेरे पास एक और सवाल है: क्या "इसके बजाय XXX का उपयोग करें" जैसे संदेश जोड़ना संभव है?
जुलिएन

22
@ जुलियन: हाँ __attribute((deprecated(use method XXX instead))):। लेकिन यह सिंटैक्स केवल gcc 4.5 से शुरू होने के लिए उपलब्ध है, और Xcode के साथ शिप किया गया संस्करण 4.2 है ...
kennytm

यदि मैं पदावनत विशेषता को केवल घोषणा पद्धति में जोड़ता हूं, तो संकलक का कहना है कि "विधि के क्रियान्वयन में गुण और उसकी घोषणा का मिलान होना चाहिए"। क्या मुझे विधि कार्यान्वयन में smth जोड़ने की आवश्यकता है?
बोरुत तोमाज़िन

2
यह स्वीकृत उत्तर नहीं होना चाहिए। यह कैसे एप्पल ऐसा नहीं होता है, और यह तरीका भद्दा से कीDEPRECATED_ATTRIBUTE
Adlai चिल्लाई

74

आप अधिक पठनीय परिभाषित का उपयोग भी कर सकते हैं DEPRECATED_ATTRIBUTE

इसमें परिभाषित किया गया है usr/include/AvailabilityMacros.h:

#define DEPRECATED_ATTRIBUTE        __attribute__((deprecated))
#define DEPRECATED_MSG_ATTRIBUTE(msg) __attribute((deprecated((msg))))

उद्देश्य-सी विधियाँ उदाहरण:

@interface MyClass : NSObject { ... }
-(void)foo:(id)x DEPRECATED_ATTRIBUTE;

// If you want to specify deprecated message:
-(void)bar:(id)x DEPRECATED_MSG_ATTRIBUTE("Use baz: method instead.");
...
@end

आप पूरे वर्ग को चिह्नित के रूप में भी चिह्नित कर सकते हैं:

DEPRECATED_ATTRIBUTE
@interface DeprecatedClass : NSObject { ... }
...
@end

2
इस तरह से Apple इसे iOS क्लासेस में भी करता है। शायद बेहतर तरीका है।
लूनाकोडगर्ल

2
यह निश्चित रूप से बेहतर तरीका है। अफ़सोस कि यह चयनित उत्तर नहीं है, या उच्चतर मतदान का जवाब नहीं है।
बेंजोना

मैं DEPRECATED_MSG_ATTRIBUTEसंदेश के साथ एक वर्ग को चिह्नित करने के लिए कैसे उपयोग कर सकता हूं (जैसे
UIAlertView

1
क्या स्विफ्ट में उपलब्ध विशेषताओं के समान 'बदला हुआ' की अवधारणा है?
जो सुसनिक

5

स्विफ्ट 5.0

किसी भी विधि / वर्ग / संरचना / प्रोटोकॉल का उपयोग करते हुए पदावनत करें @available

@available(*, deprecated, message: "Parse your data by hand instead")
func parseData() { }

@available(*, deprecated, renamed: "loadData")
func fetchData() { }

@available(swift, obsoleted: 4.1, renamed: "attemptConnection")
func testConnection() { }

@available(swift, deprecated: 4.0, obsoleted: 5.0, message: "This will be removed in v5.0; please migrate to a different API.")

संभव परम

  • शुरू की
  • पदावनत
  • पुराना
  • संदेश
  • नाम बदली गई

अधिक जानकारी के लिए देखें Apple doc: विशेषताएँ


1

यदि आप अपने xcode प्रोजेक्ट में C ++ 14 का उपयोग कर रहे हैं, तो आप उस भाषा के भाग का [[deprecated]]या [[deprecated("reason")]]विशेषता का भी उपयोग कर सकते हैं।

प्रलेखन देखें: http://en.cppreference.com/w/cpp/language/attributes


0

- स्विफ्ट कोड के लिए:

इस अधिकार को विधि के ऊपर रखें: @available(*, deprecated: <#Version#>, message: <#Message#>)

उदाहरण:

@available(*, deprecated: 11, message: "Use color assets instead")
public struct ColorPaletteItemResource: ColorPaletteItemResourceType {
    ...
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.