我正在尝试从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”'。即使我让它在之前存在......
答案 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 {