使用未解析的标识符swift 3.0

时间:2017-02-12 18:10:58

标签: json xcode swift3

我正在尝试从php获取一个json数组并将其保存为xcode中的数组以便使用。我能够拉出json数据并将其打印在xcode终端内,但出于某种原因,我可以“引用数组而不会出错”。这是我的代码!!

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

    //connect to website
    let url = URL(string:"******")
    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
        if error != nil
        {
            print("error")
        }
        else
        {
            if let content = data
            {
                do
                {
                    //download JSON data from php page, display data
                    let SongArray = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as Any
                    print(SongArray)
                }
                catch
                {

                }
            }
        }
    }
    task.resume()

    //Make buttons

    var buttonY:  CGFloat = 20
    for song in SongArray {
        let SongButton = UIButton(frame: CGRect(x, 50, y: buttonY, width, 250, height: 30))

    }

} //close viewDidLoad

当我循环浏览SongArray

时出错

它说:'使用未解析的标识符“SongArray”'。即使我让它在之前存在......

3 个答案:

答案 0 :(得分:0)

因为SongArray位于dataTask闭包内且超出了范围。 你可以这样做:

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

    //connect to website
    var SongArray: Any
    let url = URL(string:"******")
    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
        if error != nil
        {
            print("error")
        }
        else
        {
            if let content = data
            {
                do
                {
                    //download JSON data from php page, display data
                    SongArray = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as Any
                    print(SongArray)
                }
                catch
                {

                }
            }
        }
    }
    task.resume()

    //Make buttons

    var buttonY:  CGFloat = 20
    for song in SongArray {
        let SongButton = UIButton(frame: CGRect(x, 50, y: buttonY, width, 250, height: 30))

    }

}

答案 1 :(得分:0)

您的代码因多种原因无效:

  • 您将收到编译器错误,因为您忽略了实际类型。 Any永远是最糟糕的解决方案,如果你知道它是一种更具体的类型。
  • URLSession异步工作,song循环将永远不会执行。您必须将置于完成块

根据给定的JSON,对象是String数组的数组。

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

    //connect to website
    let url = URL(string:"******")
    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
        if error != nil {
            print("error:", error!)
        }
        else {

            do {
                //download JSON data from php page, display data
                let songArray = try JSONSerialization.jsonObject(with: data!, options: []) as! [[String]]
                print(songArray)
                //Make buttons

                var buttonY:  CGFloat = 20
                for song in songArray {
                    let songButton = UIButton(frame: CGRect(x: 50, y: buttonY, width: 250, height: 30))
                }
            }
            catch {
                print(error)
            }
        }
    }
    task.resume()

} //close viewDidLoad

作为副作用,可以神奇地解决问题中的use of unresolved identifier错误。

答案 2 :(得分:-1)

答案是评论的组合

//connect to website
    var SongArray: Array<Any>
    let url = URL(string:"http://cgi.soic.indiana.edu/~team22/SongData.php")
    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
        if error != nil
        {
            print("error")
        }
        else
        {
            if let content = data
            {
                do
                {
                    //download JSON data from php page, display data
                    let SongArray = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as Any
                    print(SongArray)
                }
                catch
                {

                }
            }
        }
    }
    task.resume()

    //Make buttons

    var buttonY:  CGFloat = 20
    for song in SongArray {