2016-05-09 3 views
5

मैं धीरे-धीरे ओबीजे-सी से स्विफ्ट में माइग्रेट करने की कोशिश कर रहा हूं। मेरा पहला कदम स्विफ्ट एक्सटेंशन के लिए छोटे, सरल तरीकों को माइग्रेट करना है, इसलिए मैंने didRegisterForRemoteNotifications को आजमाने और माइग्रेट करने का निर्णय लिया लेकिन यह काम नहीं किया क्योंकि ऐसा लगता है कि विधि मेरे उद्देश्य-सी कोड में कहीं और लागू की गई है। यह नहीं।कार्यान्वयन किया गया रजिस्ट्रारफॉररोटोट नोटिफिकेशनविथडिवाइस टोकन एक स्विफ्ट एक्सटेंशन में काम नहीं करता

मैं Xcode 7.3 (7D175)

उपयोग कर रहा हूँ यहाँ कुछ प्रजनन चरणों है:

  • एक नया Obj सी परियोजना बनाएँ।
  • AppDelegate-Extension.swift नामक एक नई खाली स्विफ्ट फ़ाइल बनाएं। यह एक ब्रिजिंग हेडर फ़ाइल भी बनाता है।
  • ब्राइडिंग हेडर फ़ाइल में #import AppDelegate.h जोड़ें।
  • खाली स्विफ्ट फ़ाइल और प्रकार पर जाएं:

    extension AppDelegate { 
    
        public func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { 
    
        } 
    } 
    

इस संकलक करने के लिए कारण बनता है शिकायत करने के लिए:

method 'application(_:didRegisterForRemoteNotificationsWithDeviceToken:)' with Objective-C selector 'application:didRegisterForRemoteNotificationsWithDeviceToken:' conflicts with previous declaration with the same Objective-C selector public func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { ^ __ObjC.AppDelegate:38:17: note: 'application' previously declared here public func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)

क्या मैं गलत कर रहा हूँ?

संपादित करें: कुछ सुझाव है कि मैं कोशिश की है:

Add override to the method declaration so it reads override public ...

यह (मूल त्रुटि के अलावा) निम्नलिखित त्रुटि देता है

error: method does not override any method from its superclass override public func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData)

+0

स्विफ्ट हेडर फ़ाइल का क्या मतलब है? आपको ब्रिज क्लास बनाना चाहिए और अपना 'AppDelegate.h' आयात करना चाहिए –

+0

क्षमा करें, यही मेरा मतलब है। मैंने इसे प्रतिबिंबित करने के लिए प्रश्न संपादित किया है। – OlivaresF

+0

कोशिश 'ओवरराइड समारोह आवेदन (आवेदन: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {' –

उत्तर

2

आपकी समस्या आप कर सकते हैं वह यह है कि एक मिश्रित स्विफ्ट & उद्देश्य-सी पर्यावरण में इस तरह से एक विस्तार का उपयोग नहीं करते हैं।

स्विफ्ट में, आप किसी वर्ग द्वारा अपनाए गए प्रोटोकॉल में घोषित कार्यों के लिए कार्यान्वयन प्रदान करने के लिए एक एक्सटेंशन का उपयोग कर सकते हैं। यह 'प्रोटोकॉल उन्मुख-प्रोग्रामिंग' का मूल है

उद्देश्य-सी में, एक श्रेणी का उपयोग मौजूदा वर्ग में अतिरिक्त कार्यों को जोड़ने के लिए किया जाता है। जब आप अपना स्विफ्ट एक्सटेंशन बनाते हैं, तो एक्सकोड व्युत्पन्न-डेटा फ़ोल्डर में लक्ष्यनाम-स्विफ्ट.h फ़ाइल बनाता है। अब, आप इस फाइल क्योंकि आपके संकलन में विफल रही है नहीं देख सकते हैं, लेकिन यदि आप अपने विस्तार से थोड़ा बदल दें ताकि संकलन

extension AppDelegate { 
    public func application(app application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {  
    } 
} 

काम करता है और उसके बाद आप इस फ़ाइल को आप की तरह कुछ मिल जाएगा पर नज़र डालें:

@interface AppDelegate (SWIFT_EXTENSION(XTNTest)) 
    - (void)applicationWithApp:(UIApplication * _Nonnull)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData * _Nonnull)deviceToken; 
@end 

ध्यान दें कि आपकी एक्सटेंशन विधि को AppDelegate पर श्रेणी के रूप में कैसे जोड़ा गया है। अब, कल्पना इस फाइल अगर आप

@interface AppDelegate (SWIFT_EXTENSION(XTNTest)) 
    - (void)application:(UIApplication * _Nonnull)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData * _Nonnull)deviceToken; 
@end 

अपने कार्य के सही रूप (हस्ताक्षर में कोई app) यह एक विधि है कि पहले से ही UIApplicationDelegate प्रोटोकॉल में घोषित किया जाता है की एक फिर से घोषणा है था दिखाई देंगे।

यह सब का अपवाद यह है कि आपको कक्षा-दर-वर्ग आधार पर स्विफ्ट को अपनाने की आवश्यकता है या यदि आप फ़ंक्शन-बाय-फ़ंक्शन आधार का उपयोग करना चाहते हैं तो आपको सबक्लासिंग का उपयोग करने की आवश्यकता है क्योंकि इसमें कोई अंतर है उद्देश्य-सी श्रेणी और एक स्विफ्ट एक्सटेंशन।

+0

हाँ। मेरा टेस्ट-स्विफ्ट.h स्वत: जेनरेट की गई फ़ाइल आपके द्वारा उल्लिखित चीज़ों के समान ही दिखती है ... धन्यवाद! – OlivaresF

संबंधित मुद्दे