Член экземпляра нельзя использовать для типа Codable JSON - PullRequest
0 голосов
/ 12 сентября 2018

Кажется, я не могу получить доступ к членам структуры, кроме как внутри блока JSONDecoder.Как я могу получить доступ к этим возвращаемым значениям API в другом месте, как в функции, которая может быть вызвана где угодно и возвращает данные API.Последняя строка выходит за рамки или не разрешена.

class ViewController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        struct ObjectLookup: Codable {
            let ObjectID: Int?
            let ObjectName: String?
            let Creators: String?
            let Medium: String?
            let Titles: String?
            let LabelUUID: String?

            static func fetch(withID id : String){
                let urlString = DomainURL + "\(id)"



                print("urlString is \(urlString)" )
                if let url = URL(string: urlString) {
                    let task = URLSession.shared.dataTask(with: url, completionHandler: { (data,response,error) in
                        print(String(data: data!,encoding: .ascii) ?? "no data")

                        if let ObjectLookup = try? JSONDecoder().decode(ObjectLookup.self, from: data!) {
                            print( ObjectLookup.ObjectName ?? "no url")

                        }

                    })
                    task.resume()

                }else{
                    print("bad url")
                }
            }
        }




        ObjectLookup.fetch(withID: "2322A63C74C92")
        let myName = ObjectLookup.ObjectName

    }

1 Ответ

0 голосов
/ 12 сентября 2018

Рефакторинг это к этому

class ViewController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        ObjectLookup.fetch(withID: "2322A63C74C92") { obj in
          print(obj?.ObjectName)
        }

    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)


    }

}

struct ObjectLookup: Codable {
    let ObjectID: Int?
    let ObjectName: String?
    let Creators: String?
    let Medium: String?
    let Titles: String?
    let LabelUUID: String?

    static func fetch(withID id : String,completion:@escaping(_ ret:ObjectLookup?) -> Void ){
        let urlString = DomainURL + "\(id)" 

        print("urlString is \(urlString)" )
        if let url = URL(string: urlString) {
            let task = URLSession.shared.dataTask(with: url, completionHandler: { (data,response,error) in
                print(String(data: data!,encoding: .ascii) ?? "no data")

                if error != nil {
                  compeltion(nil)
                  return
                }

                if let res = try? JSONDecoder().decode(ObjectLookup.self, from: data!) {
                    print( res.ObjectName ?? "no url")
                    completion(res)

                }

            })
            task.resume()

        }else{
            print("bad url")
            completion(nil)
        }
    }
}

Не используйте заглавные буквы в именах переменных, используйте camelCase (делайте это только для классов), я знаю, что изменение любой буквы нарушит процесс кодирования, поэтому сохраняйте егоили используйте CodingKeys для преобразования переменных, также обратите внимание, что обратный вызов URLSession.shared.dataTask находится в фоновой очереди, поэтому рассмотрите возможность использования

DispatchQueue.main.async {}

внутри обратного вызова в viewDidLoad, если вы хотите выполнить какую-либо операцию пользовательского интерфейса

...