2015-11-19 672 views
6

Bir bildiriminde bir nesne olarak bir enum göndermek istiyorum: Bir enum AnyObject? uymuyor çünküSwift'de bir bildirimde enum değeri nasıl gönderilir?

enum RuleError:String { 
    case Create, Update, Delete 
} 

class myClass { 

    func foo() { 
     NSNotificationCenter.defaultCenter().postNotificationName("RuleFailNotification", 
              object: RuleError.Create) 
    } 
} 

Ne yazık ki bu çalışmıyor.

Bu sorunu nasıl aşacağınız hakkında bir fikriniz var mı?

cevap

7

Kullandığınız işlevdeki object parametresi, gönderenin, bildirimi gönderen nesnenin parametre değil, göndericidir. Dokümanlar here'a bakın.

Sen aşağıdaki yöntemi kullanıcı bilgisi sözlükte parametre olarak göndermek ve kullanmak istediğiniz numaralandırma değeri koymalıyız: Senin durumunda

func postNotificationName(_ aName: String, 
        object anObject: AnyObject?, 
       userInfo aUserInfo: [NSObject : AnyObject]?) 

:

let userInfo = ["RuleError" : RuleError.Create.rawValue] 

NSNotificationCenter.defaultCenter().postNotificationName("RuleFailNotification", 
     object: self, 
     userInfo:userInfo) 

Ve işlemek için bildirim, ilk bunun için kayıt:

NSNotificationCenter.defaultCenter().addObserver(
     self, 
     selector: "handleRuleFailNotification:", 
     name: "RuleFailNotification", 
     object: nil) 

Sonra hallederim:

func handleRuleFailNotification(notification: NSNotification) { 

     let userInfo = notification.userInfo 

     RuleError(rawValue: userInfo!["RuleError"] as! String) 
    } 
+1

Bu talihsiz zorunluluktur çıkmak unutmayın. Bildirimler, enil ve yapıları ikinci sınıf durumuna zorlar. Enumlar genellikle kısıtlı bir Int veya String olduğundan ve bu bir değer kadar iyi olduğundan, Swift'de büyük bir eksiklik olduğunu hissediyorum. – BaseZen

2

kolay çözüm daha sonra bir enum

RuleError(rawValue : "Create") 

Ama object parametreye geri dönüştürülmüş olabilir

RuleError.Create.rawValue 
için uygun yer değil ham değerini göndermektir özel veri gönder. userInfo sözlüğünü daha iyi kullanın.

1

NSNotification üzerinden enum benzeri bir Swift türü göndermek için kutuyu kullanabilirsiniz. Sen ilişkili değerlerinin bile Swift enum gönderebilir

if let box = notification.userInfo?["RuleFailNotification"] as? Box<RuleError> { 
    let ruleError = box.value 
} 

:

final class Box<T>: NSObject { 
    let value: T 
    init(_ value: T) { 
     self.value = value 
    } 
} 

bir bildirim yayınlamak için: olarak gözlemci olarak

let userInfo = ["RuleError" : Box(RuleError.Create)] 
NSNotificationCenter.defaultCenter().postNotificationName("RuleFailNotification", 
    object: self, 
    userInfo:userInfo) 

, değer alınabilir. Örnek:

+0

Son kod bloğunda "userInfo? [" RuleError "]' olmalıdır değil mi? – Tropper

0

Örnek.Swift 3

1: Bazı enum

enum NetworkReachabilityStatus { 
    case connected 
    case notConnected 
} 

3:

extension NSNotification.Name { 
    public static let NetworkReachabilityStatus: NSNotification.Name = 
    NSNotification.Name(rawValue: "NetworkReachabilityStatusChanged") 
} 

2 bildirim Adını oluşturma Gönderme veri

NotificationCenter.default.post(name: Notification.Name.NetworkReachabilityStatus, 
        object:nil, 
        userInfo:[kNetworkRechabilityStatus: NetworkReachabilityStatus.notConnected]) 
  • kNetworkRechabilityStatus -
  • sabit dizedir

4:

override func viewDidLoad() { 
    super.viewDidLoad() 
    NotificationCenter.default.addObserver(self, selector: #selector(networkStatusChanged(_:)), name: Notification.Name.NetworkReachabilityStatus, object: nil) 
} 

func networkStatusChanged(_ notification: Notification) { 
    let status: NetworkReachabilityStatus = notification.userInfo?[kNetworkRechabilityStatus] as! NetworkReachabilityStatus 
    switch status { 
    case .connected: 

     break 
    case .notConnected: 

     break 
    } 
} 

Gözlem Ve bildirimin :)