2015-11-19 14 views
6

私は、通知内のオブジェクトとして列挙型を送信したい:Swiftの通知でenum値を送信するにはどうすればよいですか?

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

class myClass { 

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

残念ながら、これはAnyObject?と一致していません列挙ので、動作しません。

どのようにすればこの問題を回避できますか?

答えて

7

使用する関数のobjectパラメータは、パラメータではなく通知を送信する送信者です。ドキュメントhereをチェックしてください。

あなたは以下の方法ユーザ情報辞書のパラメータとして送信し、使用する列挙型の値に置く必要があります:あなたのケースでは

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) 

をさらに処理するために通知、最初の登録:

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

次に対処:

func handleRuleFailNotification(notification: NSNotification) { 

     let userInfo = notification.userInfo 

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

これは不幸な必然であるから解除することを忘れないでください。 Notificationsはenumとstructを強制的に第2クラスの状態にします。 Enumは制限されたIntやStringであることが多いので、これはSwiftの主な欠点だと思っていますが、これらは値としては問題ありません。 – BaseZen

2

最も簡単な解決策は、後に列挙

RuleError(rawValue : "Create") 

しかしobjectパラメータに変換することができ

RuleError.Create.rawValue 
がへの適切な場所ではありません生の値を送信することですカスタムデータを送信します。 userInfo辞書を使用してください。

1

NSNotificationを使用してボクシングを使用して、列挙型のような純粋なスウィフトタイプを送信できます。

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

通知投稿する:あなたも、関連する値でスウィフト列挙を送ることができます

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

:あなたのオブザーバーで

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

を、値をとして取得することができます。

+0

最後のコードブロックでは 'userInfo?[" RuleError "]'ではありませんか? – Tropper

0

例。スウィフト3

1:

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

2通知名を作成:一部の列挙

enum NetworkReachabilityStatus { 
    case connected 
    case notConnected 
} 

3:投稿データ

NotificationCenter.default.post(name: Notification.Name.NetworkReachabilityStatus, 
        object:nil, 
        userInfo:[kNetworkRechabilityStatus: NetworkReachabilityStatus.notConnected]) 
  • kNetworkRechabilityStatus - 文字列定数
  • です

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 
    } 
} 

を観察し、通知:)

関連する問題