2017-02-12 65 views
-1

我想从php中取出一个json数组,并将其保存为xcode中的一个数组来处理。我能够拉动json数据并在xcode终端中打印它,但出于某种原因,我可以'参考数组而不会出错。这是我的代码!使用未解决的标识符swift 3.0

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”'。即使我'让'它存在之前..

+0

不相关,但为什么你使用包含'Array'的变量名称,但将对象转换为'Any'(aka * I-no-idea *)?这很可能会导致编译错误。 – vadian

+0

不知道,我只知道'as Any'部分参与了swift格式的jsonserialization ..我认为它只是为了捕获数据而不管是什么类型的json对象,它是 – xteetsx

+0

**你明明知道什么键入它是如此告诉编译器。 – vadian

回答

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错误的副作用。

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)) 

    } 

} 
+0

中完全没有意义,谢谢!但现在错误更改为“'类型'任何不符合协议'序列'”。 – xteetsx

+0

这是另一个错误。将'as Any'更改为'as Array'或'Dictionary'取决于下载的数据 – mhergon

+0

当我做出改变时,它表示它期望任何非数组,并且它是一个数组,因此如果它起作用我会保持它 – xteetsx

-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 { 
相关问题