तो यह पता चला है कि AnyObject आईडी के लिए आध्यात्मिक उत्तराधिकारी है, आप किसी भी संदेश को AnyObject पर कॉल कर सकते हैं। वह आईडी पर एक संदेश भेजने के बराबर है। ठीक है पर्याप्त ठीक है। लेकिन अब हम इस अवधारणा में जोड़ते हैं कि AnyObject पर सभी तरीके वैकल्पिक हैं , और हमारे पास कुछ ऐसा है जिसके साथ हम काम कर सकते हैं।
उपरोक्त को देखते हुए, मुझे उम्मीद थी कि मैं AnyObject में UIApplication.saredApplication () कर सकता हूं, फिर विधि हस्ताक्षर के बराबर एक चर बनाएं, उस चर को वैकल्पिक विधि पर सेट करें, फिर चर का परीक्षण करें। यह काम नहीं लगता था। मेरा अनुमान है कि जब आईओएस 8.0 एसडीके के खिलाफ संकलित किया जाता है, तो कंपाइलर जानता है कि यह कहां लगता है कि विधि होनी चाहिए, इसलिए यह एक मेमोरी लुकअप के लिए नीचे सभी को अनुकूलित करता है। जब तक मैं चर का परीक्षण करने की कोशिश नहीं करता, तब तक सब कुछ ठीक रहता है, जिस समय मुझे एक EXC_BAD_ACCESS मिलता है।
हालांकि, उसी WWDC में जहां मैंने सभी तरीकों के वैकल्पिक होने के बारे में मणि पाया, वे वैकल्पिक विधि को कॉल करने के लिए वैकल्पिक चैनिंग का उपयोग करते हैं - और यह काम करने लगता है। लंगड़ा हिस्सा यह है कि आपको वास्तव में यह जानने के लिए विधि को कॉल करने का प्रयास करना है कि क्या यह मौजूद है, जो सूचनाओं के लिए पंजीकरण के मामले में एक समस्या है, क्योंकि आप यह पता लगाने की कोशिश कर रहे हैं कि क्या यह विधि आपके द्वारा बनाए जाने से पहले मौजूद है UIUserNotificationSettings ऑब्जेक्ट। ऐसा लगता है कि शून्य से उस पद्धति को कॉल करना ठीक है, इसलिए जो समाधान मेरे लिए काम कर रहा है वह है:
var ao: AnyObject = UIApplication.sharedApplication()
if let x:Void = ao.registerUserNotificationSettings?(nil) {
// It's iOS 8
var types = UIUserNotificationType.Badge | UIUserNotificationType.Sound | UIUserNotificationType.Alert
var settings = UIUserNotificationSettings(forTypes: types, categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
} else {
// It's older
var types = UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound | UIRemoteNotificationType.Alert
UIApplication.sharedApplication().registerForRemoteNotificationTypes(types)
}
इससे संबंधित बहुत खोज करने के बाद, प्रमुख जानकारी इस WWDC से आई है https://developer.apple.com/videos/wwdc/2014/#407 "अनुभाग में प्रोटोकॉल में वैकल्पिक तरीके" के बारे में।
Xcode 6.1 बीटा में उपरोक्त कोड अब काम नहीं करता है, नीचे दिया गया कोड काम करता है:
if UIApplication.sharedApplication().respondsToSelector("registerUserNotificationSettings:") {
// It's iOS 8
var types = UIUserNotificationType.Badge | UIUserNotificationType.Sound | UIUserNotificationType.Alert
var settings = UIUserNotificationSettings(forTypes: types, categories: nil)
UIApplication.sharedApplication().registerUserNotificationSettings(settings)
} else {
// It's older
var types = UIRemoteNotificationType.Badge | UIRemoteNotificationType.Sound | UIRemoteNotificationType.Alert
UIApplication.sharedApplication().registerForRemoteNotificationTypes(types)
}