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