Импорт Firebase вызывает неоднозначную выборку JSON - PullRequest
0 голосов
/ 11 февраля 2019

Я загружал JSON в свой View Controller, и мне нужна была функция для добавления данных в тот же VC в firebase, поэтому импортировал Firebase (ядро firebase Pods, auth и firestore), и теперь он дает мне ошибку при получении JSONчто это неоднозначное использование 'subscript'

func getDetails(link: URL!) {
    var plot : String = " "

    let task = URLSession.shared.dataTask(with: link!) { (data, response, error) in
        if error != nil
        {
            print("error")
        }
        else
        {
            if let content = data
            {
                do
                {
                    //JSON results
                    let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableLeaves) as AnyObject


           //myJson ~~~ ["Plot"]  Ambiguous use of 'subscript'
                    plot = myJson["Plot"] as! String

                }


                catch
                {
                    print("error in JSONSerialization")
                }
            }
        }
    }
    task.resume()

    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: {
        self.plot.text = plot
    })

}

Мне бы хотелось сохранить возможность выбирать значение "Plot" JSON и запускать firebase

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Ваша проблема - результат каста от JSONSerialization до AnyObject.Если вы хотите иметь возможность использовать нижний индекс, в вашем случае вы должны понизить результат до типа словаря, например [String:Any]

if let myJson = try JSONSerialization.jsonObject(with: content, options: .mutableLeaves) as? [String:Any] {
    // plot = myJson["Plot"] as? String ?? "Default value"
}

В любом случае, лучше узнать кое-что о Codable ииспользуйте его вместо JSONSerialization.Просто создайте класс / структуру, соответствующую протоколу Decodable, а затем используйте JSONDecoder для декодирования Data объекта.

0 голосов
/ 11 февраля 2019

Вот как я бы переписал этот метод, учитывая ModelObject структуру или класс, представляющий ответ вашего сервера.

func getDetails(link: URL!) {
    var plot = " "
    let group = DispatchGroup()

    group.enter()
    let task = URLSession.shared.dataTask(with: link!) { (data, response, error) in
        defer { group.leave() }

        guard error == nil else {
            print(error)
            return
        } 
        if let content = data {
            do {
                let modelObject = try JSONDecoder().decode(ModelObject.self, from: data)
                plot = modelObject.plotString
            }
            catch {
                print(error)
            }
        }
    }
    task.resume()

    group.notify(queue: DispatchQueue.main) {
        self.plot.text = plot
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...