Подтвердить что ты не робот

Как получить доступ к Словарю, переданному через NSNotification, используя Swift

У меня есть код, который отправляет уведомление (где serialNumber является строкой):

  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 для извлечения объекта, в данном случае словаря, который был передан через уведомление, и получить доступ к составным частям этого объекта (в этом случае к ключам и значениям)?

4b9b3361

Ответ 1

Поскольку тип 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")
}

Ответ 2

Вы должны использовать структуру типа [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
}