2016-08-11 15 views
10

Ben Xcode 8 beta 5 kullanıyorum ve sonra bildirim isimlerleSwift 3 - Enum raw değerini NSNotification.Name olarak nasıl kullanılır?

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

Ama ben onları kullanmaya çalışıyorum bu

enum Notes: String { 
    case note1 
    case note2 
} 

gibi kurulum için bildirimlerin bir enum çalışıyorum hata almak

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

bir çalışma etrafında var mı, yoksa ben mi yanlış anlıyorum? Xcode 7.3.1

'da çalışır. Gittiğiniz İşte

cevap

27

, Kullanım Swift 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) 
    } 
} 

2.2.1/SDK'leri içinde paketlenmiş

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

Hızlı yanıt için teşekkürler. Uzantıları düşünmeliydim! –

+0

Sanırım 'enum MyNames'i' extension Notification.Name 'içine koymak için bir neden yok. O sadece hiçbir anlam ifade etmiyor. – faviomob

4

olarak bildiğim kadarıyla, Swift hiçbir türünü NSNotification.Name yoktu bir başka yolu Xcode 7.3.1, bu yüzden nasıl çalıştığını merak ediyorum. Eğer enum kullanmak istiyorsanız

Neyse böyle bir şey yazmaya gerek: Bu arada

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

, benim en iyi tavsiye tanımlamak için senin Notification.Name statik özellikleri tanımlar uzantı kullanıyor kendi:

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

bu gibi kullanabilirsiniz (Bu biraz daha uzun enum ... daha ama):

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

Haklısınız. Swift 2.2'de "NSNotification.Name" yok. Ben sadece bildirim ismini ham değere atayabiliyordum. Daha açık olmalıydım. –

+1

@ D.Greg, açıklık için teşekkürler. Bildiğiniz gibi Swift arıları hızla değişiyor, korkuyordum ki bir şeyleri kaçırıyor olabilirim. – OOPer

17

Bu şekilde yapıyorum, Bu benim için Bildirim adlarını yönetmenin daha basit bir yoludur. Notification.Name uzantısı kullanılarak

Swift 3.0 ve Xcode 8,0

, aşağıdaki şekilde olduğu iç statik isimleri tanımlayabilir.

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

Biz kullanabileceği böyle isimleri:

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

func newPasscodeSetAction() { 
    // Code Here. 
} 

Umut sizin için bu basit bir yolu.

+0

çok temiz ve zarif bir şekilde –