Как получить userinfo из NSNotification в swift 3

#ios #swift #swift3 #ios10

#iOS #swift #swift3 #ios10

Вопрос:

Я получил эту ошибку в swift3:

 Cannot convert value of type [AnyHashable : Any] to type NSDictionary in coercion.
  

Мой код:

   func downloadProgress(notification:NSNotification){

    if let userInfo = notification.userInfo as NSDictionary
    {
         print(userInfo) // [AnyHashable("progressPercentage"): 0.82530790852915281]

      if let progressValue = userInfo["progressPercentage"] as? Float {
        if progressValue > 0.01{

        }
      }
    }
  }
  

Фактическое значение userInfo — это всего ["progressPercentage": 0.82530790852915281] лишь напечатанное как [AnyHashable("progressPercentage"): 0.82530790852915281] и не удовлетворяющее if условию.

Редактировать:

Не повезло notification.userInfo as? [AnyHashable: Any] , но теперь работает для notification.userInfo as? [String: AnyObject] и notification.userInfo as? [String: Any]

введите описание изображения здесь

введите описание изображения здесь

Комментарии:

1. Как насчет notification.userInfo as? [String: AnyObject] ?

2. Зачем вам вообще нужно его использовать?

3. @ozgur, приведение к [String: AnyObject] работам сейчас

4. @MuruganandhamK — вы видели мой ответ, я четко упомянул об этом, если вы знаете, какой тип используется [String: Any] для swift3, если вы используете [String: AnyObject] его для swift2

5. @Anbu.Karthik, да, я использовал [String: Any]

Ответ №1:

введите converson

введите описание изображения здесь

используйте

  func downloadProgress(notification:NSNotification){

if let userInfo = notification.userInfo as [String: Any] // or use if you know the type  [AnyHashable : Any]
{
     print(userInfo) 

  if let progressValue = userInfo["progressPercentage"] as? Float {
    if progressValue > 0.01{

    }
  }
}
 }
  

для получения дополнительной информации см. Справочные документы по API

Комментарии:

1. Привет, @Anbu.Karthik, [AnyHashable : Any] здесь не работает. [String: Any] и [String: AnyObject] теперь поддерживают приведение типов

2. Принято ваше 🙂

3. @MuruganandhamK — не так ,

Ответ №2:

Пожалуйста, используйте новый класс Notification вместо NSNotification .

У меня нет с собой моего Mac, но это должно решить проблему.

Это изменение применяется автоматически, если вы используете встроенный инструмент преобразования Xcode Swift.

Комментарии:

1. привет @Teejay, проблема не Notification в том, или с NSNotification . Все о приведении типов

2. Хорошо, но, вероятно, если вы используете инструмент преобразования, он также преобразует NSDictionary в правильную [AnyHashable : Any] конструкцию.

3. да, я понял. Спасибо