2017-02-12 39 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 { 
相關問題