2016-08-11 6 views
10

मैं Xcode 8 बीटा 5 उपयोग कर रहा हूँ और मैं फिर उन्हें अधिसूचना नामस्विफ्ट 3 - NSNotification.Name के रूप में enum कच्चे मूल्य का उपयोग कैसे करें?

NotificationCenter.default.post(name: Notes.note1.rawValue as NSNotification.Name, 
           object: nil, userInfo: userInfo) 

लेकिन मैं कर रहा हूँ के रूप में उपयोग करने की कोशिश कर इस

enum Notes: String { 
    case note1 
    case note2 
} 

तरह की सूचनाओं का एक enum सेटअप करने के लिए कोशिश कर रहा हूँ एक त्रुटि हो रही है।

Cannot convert value of type 'String' to specified type 'NSNotification.Name'

वहाँ एक काम के आसपास है, या मैं कुछ याद आ रही है? यह एक्सकोड 7.3.1

में काम करता है किसी भी मदद की सराहना की जाएगी।

उत्तर

27

यहां आपको उपयोग स्विफ्ट 3 & Xcode 8,0

enum Notes: String { 

    case note1 = "note1" 
    case note2 = "note2" 

    var notification : Notification.Name { 
     return Notification.Name(rawValue: self.rawValue) 
    } 
} 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NotificationCenter.default.post(name: Notes.note2.notification ,object: nil, userInfo: nil) 
    } 
} 

एक और तरीका है

import UIKit 

extension Notification.Name 
{ 
    enum MyNames 
    { 
     static let Hello = Notification.Name(rawValue: "HelloThere") 
    } 
} 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     NotificationCenter.default.post(name: Notification.Name.MyNames.Hello ,object: nil, userInfo: nil) 
    } 
} 
+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। मुझे एक्सटेंशन के बारे में सोचना चाहिए था! –

+0

मुझे लगता है कि 'विस्तार नोटिफिकेशन' नाम के अंदर 'enum MyNames' डालने का कोई कारण नहीं है। इसमें बिलकुल मतलब नहीं है। – faviomob

4

जहाँ तक मुझे पता है, वहाँ स्विफ्ट में कोई प्रकार NSNotification.Name था में बंडल 2.2.1/SDKs एक्सकोड 7.3.1, इसलिए मैं उत्सुक हूं कि आपने इसे कैसे काम किया है।

वैसे भी आप कुछ इस तरह लिखने की ज़रूरत अगर आप अपने enum का उपयोग करना चाहते हैं:

NotificationCenter.default.post(name: NSNotification.Name(Notes.note1.rawValue), 
           object: nil, userInfo: userInfo) 

वैसे, मेरी सबसे अच्छी सिफारिश परिभाषित करने के लिए अपने स्वयं के Notification.Name विस्तार जो स्थिर गुणों को परिभाषित करता उपयोग कर रहा है:

extension Notification.Name { 
    static let note1 = NSNotification.Name("note1") 
    static let note2 = NSNotification.Name("note2") 
} 

(यह एक छोटा सा से enum ... अब है, लेकिन) आप इस तरह इसका इस्तेमाल कर सकते हैं:

NotificationCenter.default.post(name: .note1, 
           object: nil, userInfo: userInfo) 
+0

आप सही हैं। स्विफ्ट 2.2 में 'NSNotification.Name' नहीं है। मेरा मतलब था कि मैं सिर्फ कच्चे मूल्य के साथ अधिसूचना नाम असाइन कर सकता हूं। मुझे और अधिक स्पष्ट होना चाहिए था। –

+1

@ डी। ग्रेग, स्पष्टीकरण के लिए धन्यवाद। जैसा कि आप जानते हैं स्विफ्ट बीटा इतनी तेज़ी से बदल रहे हैं, मुझे डर था कि मुझे कुछ याद आ रहा है। – OOPer

17

मैं इस तरह से कर रहा हूं, मेरे लिए अधिसूचना नामों का प्रबंधन करने का यह एक आसान तरीका है।

स्विफ्ट 3.0 और Xcode 8,0

Notification.Name के विस्तार का उपयोग करना, हम निम्नलिखित के रूप में है कि अंदर स्थिर नाम को परिभाषित कर सकते हैं।

extension Notification.Name { 
    static let newPasscodeSet = Notification.Name("newPasscodeSet") 
    static let userLoggedIn = Notification.Name("userLoggedIn") 
    static let notification3 = Notification.Name("notification3") 
} 

हम उपयोग कर सकते हैं कि इस तरह के नाम:

override func viewDidLoad() { 
     NotificationCenter.default.addObserver(self, selector: #selector(self.newPasscodeSetAction), name: .newPasscodeSet, object: nil) 
} 

func newPasscodeSetAction() { 
    // Code Here. 
} 

आशा इस सरल आपके लिए उपयोगी तरीका है।

+0

बहुत साफ और सुरुचिपूर्ण तरीका –

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