web-dev-qa-db-ja.com

Swiftを使用して、NSNotificationを介して渡された辞書にアクセスする方法

通知を送信するコードがあります(serialNumberはString):

  var dataDict = Dictionary<String, String>()
  dataDict["Identity"] = serialNumber
  dataDict["Direction"] = "Add"
            NSNotificationCenter.defaultCenter().postNotificationName("deviceActivity", object:self, userInfo:dataDict)

そして、この通知を受け取るコード:

  func deviceActivity(notification: NSNotification) {

     // This method is invoked when the notification is sent
     // The problem is in how to access the Dictionary and pull out the entries
  }

これを達成するためにさまざまなコードを試しましたが、成功しませんでした:

let dict = notification.userInfo
let dict: Dictionary<String, String> = notification.userInfo
let dict: Dictionary = notification.userInfo as Dictionary

そして、私の試みのいくつかはコンパイラを満足させますが、辞書として抽出されたものにアクセスしようとすると、実際の文字列を生成するものはありません:

let sn : String = dict["Identity"]!
let sn : String = dict.valueForKey("Identity") as String
let sn : String = dict.valueForKey("Identity")

質問は次のとおりです。通知を介して渡されたオブジェクト(この場合は辞書)を抽出し、そのオブジェクトのコンポーネント部分(この場合はキーと値)にアクセスするためのSwiftコードの書き方)?

37
user3864657

Notification.userInfoタイプはAnyObjectなので、適切な辞書タイプにダウンキャストする必要があります。

辞書の正確なタイプがわかったら、そこから得た値をダウンキャストする必要はありません。ただし、値を使用する前に、辞書に実際に値が存在するかどうかを確認することをお勧めします。

// First try to cast user info to expected type
if let info = notification.userInfo as? Dictionary<String,String> {
  // Check if value present before using it
  if let s = info["Direction"] {
    print(s)
  }
  else {
    print("no value for key\n")
  }
}
else {
  print("wrong userInfo type")
}
40
Vladimir

[NSObject : AnyObject]のような構造を使用し、NSDictionary yourLet[key]から値を取得する必要があります

func keyboardWillShown(notification : NSNotification){
    let tmp : [NSObject : AnyObject] = notification.userInfo!
    let duration : NSNumber = tmp[UIKeyboardAnimationDurationUserInfoKey] as NSNumber
    let scalarDuration : Double = duration.doubleValue
}
12
Oleg Kohtenko