"यह फ़ंक्शन घोषणा Xcode 9 में चेतावनी नहीं है" एक प्रोटोटाइप है


119

Xcode 9 का उपयोग करते समय, कुछ संकलक चेतावनी कह रहे हैं This function declaration is not a prototype। यह voidविधि शरीर में जोड़ने का सुझाव देता है , जो इसे हल करेगा। समस्या यह है कि उन चेतावनियों को सिस्टम-एपीआई की तरह UIApplicationप्रतिनिधि-विधियों के लिए भी फेंक दिया गया है :

- (void)application:(UIApplication *)application
    handleActionWithIdentifier:(NSString *)identifier
         forRemoteNotification:(NSDictionary *)userInfo
              withResponseInfo:(NSDictionary *)responseInfo
             completionHandler:(void (^)())completionHandler

इसे निम्नलिखित द्वारा हल किया जा सकता है:

- (void)application:(UIApplication *)application
    handleActionWithIdentifier:(NSString *)identifier
         forRemoteNotification:(NSDictionary *)userInfo
              withResponseInfo:(NSDictionary *)responseInfo
             completionHandler:(void (^)(void))completionHandler

अब मैं सोच रहा हूं कि क्या प्रतिनिधि तरीके अभी भी दीर्घकालिक पर काम करेंगे या Apple voidबाद के iOS 11 बीटा संस्करणों में सम्मिलित करेगा । मैं उत्सुक हूं क्योंकि यदि मैं voidशरीर को शामिल करता हूं , तो Xcode बेमेल पद्धति-चयनकर्ताओं (जो समझ में आता है) के बारे में शिकायत करेगा। क्या किसी ने अब तक एक ही मुद्दे का अनुभव किया?

जवाबों:


251

खाली कोष्ठक के साथ ब्लॉक की घोषणा:

void (^)()

खाली कोष्ठक के साथ फ़ंक्शन पॉइंटर के समान शब्दार्थ है:

void (*)()

इसका मतलब यह नहीं है कि कोई तर्क नहीं है। इसका मतलब है कि तर्क निर्दिष्ट नहीं हैं, इसलिए यह बग के लिए रास्ता खोलता है क्योंकि आप इसे निम्नलिखित तरीकों से कॉल कर सकते हैं:

void (^block)() = ...
block();
block(10);
block(@"myString");

जब कोई मापदंडों के साथ ब्लॉक की घोषणा करते हैं, तो हमेशा उपयोग करें:

void (^)(void)

Apple हर जगह सही ढंग से नहीं कर रहा था और वे शायद संगतता कारणों से पुराने APIs के लिए ठीक नहीं कर रहे हैं। जब तक आप नए API पर नहीं जाते, आपको उस चेतावनी को वहीं रखना होगा।

आप उस चेतावनी को बंद भी कर सकते हैं ( -Wstrict-prototypes): यहां छवि विवरण दर्ज करें

या #pragma(धन्यवाद @davidisdk ):

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wstrict-prototypes"

- (void)application:(UIApplication *)application
handleActionWithIdentifier:(NSString *)identifier
forRemoteNotification:(NSDictionary *)userInfo
   withResponseInfo:(NSDictionary *)responseInfo
  completionHandler:(void (^)())completionHandler {

}
#pragma clang diagnostic pop

एलएलवीएम की चर्चा यहां देखें या ओपनरार पर बग ।

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


5
आप iOS API को लागू करते समय चेतावनी को हटाने के लिए प्रैग्मैस का उपयोग कर सकते हैं: #pragma clang diagnostic push #pragma clang diagnostic "-Wstrict-prototypes" को अनदेखा करें - (शून्य) एप्लिकेशन: (UIAppppation *) एप्लिकेशन हैंडलActionWithIdentifier: (NSString *) पहचानकर्ता forRemotification (NSDictionary *) userInfo withResponseInfo: (NSDictionary *) responseInfo completionHandler: (शून्य (^) ()) completionHandler {#pragma बजना नैदानिक पॉप
davidisdk

1
JBChartView API के साथ इनमें से 20 के बारे में चेतावनी दी। जब तक वे स्विफ्ट 4 के लिए अपडेट करने का फैसला नहीं करते हैं, तब तक उन्हें बंद करने में सक्षम होना अच्छा है।
एडीसन

7
@tymac यह एक objc चेतावनी है। इसका स्विफ्ट से कोई लेना-देना नहीं है।
सुल्तान

> "जब कोई मापदंडों के साथ ब्लॉकों की घोषणा करते हैं, तो हमेशा (शून्य) का उपयोग करें" <क्या आप जोड़ सकते हैं कि कोड में कैसा दिखना चाहिए? के रूप में void (^)()या के लिए एक विकल्प के रूप मेंvoid (*)()
pkamb

2
@pkamb जब आपका ब्लॉक कोई पैरामीटर (यानी void(^)()) नहीं लेता है , voidतो कोष्ठक में स्पष्ट रूप से शामिल करें void(^)(void):।
बेन स्टॉक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.