Хобрук: Ваш путь к мастерству в программировании

Синтаксис Firebase в Swift 3

Я обновил Xcode до версии 8, и теперь есть проблема с Firebase. Это кусок кода:

let target = snapshot.value!["target"] as! NSDictionary
self.myZodiac.text = snapshot.value!["zodiac"] as! String
let nsHeight = snapshot.value!["height"] as! NSNumber

// Тип Any не имеет элементов нижнего индекса

В Swift 2.3 все это работает! как это исправить?

Еще один:

var messagesDictionary = [[String:Int]]()
userRef.observe(FIRDataEventType.value, with: { (snapshot) in

    for item in snapshot.children.allObjects {
        for itemDic in self.messagesDictionary {
            for (key,value) in itemDic {
                if (item as AnyObject).key == key {
                    var photo = UIImage()
                    let age = (item as AnyObject).value!["age"] as! NSNumber as Int //error Type 'Any' does not conform to protocol 'AnyObject'
                    let name = (item as AnyObject).value!["name"] as! String //error Type 'Any' does not conform to protocol 'AnyObject'
                    if (item as AnyObject).hasChild("avatar"){
                        let avatar = (item as AnyObject).value!["avatar"] as! String //error Type 'Any' does not conform to protocol 'AnyObject'
                        self.storageRef.child(key).child(avatar).data(withMaxSize: 5 * 1024 * 1024, completion: { (data, error) -> Void in
                        if (error != nil) {

                        } else {
                            photo = UIImage(data:data!)!

                        }
                        })
                        ////
                        }else{
                            photo = UIImage(named: "no_avatar")!


                    }

                }

            }
        }
    }


})

первый пример, который я использовал:

let target = (snapshot.value as? NSDictionary)?["target"] as! NSDictionary
self.myZodiac.text = (snapshot.value as? NSDictionary)?["zodiac"] as! String
let nsHeight = (snapshot.value as? NSDictionary)?["height"] as! NSNumber

что теперь делать с элементом как AnyObject из второго фрагмента кода?


Ответы:


1

FIRDataSnapshot.value относится к типу Any, поэтому вы не можете просто подписать его.

Решение состоит в том, чтобы сначала преобразовать значение в словарь:

ref!.observe(.value, with: { (snapshot) in
    for child in snapshot.children {
        let msg = child as! FIRDataSnapshot
        print("\(msg.key): \(msg.value!)")
        let val = msg.value! as! [String:Any]
        print("\(val["name"]!): \(val["message"]!)")
    }
})

Из моего ответа здесь: Неоднозначное использование индекса (Swift 3)

17.10.2016
  • Я видел, как люди используют child in snapshot.children, а также child in snapshot.children.allObjects — в чем разница? 11.11.2016

  • 2

    Попробуй это:-

    if let snapDict = snapshot.value as? [String:AnyObject]{
    
         let target = snapDict["target"] as! [String:AnyObject]
         self.myZodiac.text = snapDict["zodiac"] as! String
         let nsHeight = snapDict["height"] as! Float
    
          }
    
    17.10.2016
    Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..