使用未解决的标识符swift 3.0
问题描述:
我想从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”'。即使我'让'它存在之前..
答
您的代码不会有几个原因的工作:
- 你会得到编译器错误因为你忽略了实际的类型。如果您知道这是一个更具体的类型,则
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
错误的副作用。
答
因为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))
}
}
答
答案是评论的组合制成
//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 {
不相关,但为什么你使用包含'Array'的变量名称,但将对象转换为'Any'(aka * I-no-idea *)?这很可能会导致编译错误。 – vadian
不知道,我只知道'as Any'部分参与了swift格式的jsonserialization ..我认为它只是为了捕获数据而不管是什么类型的json对象,它是 – xteetsx
**你明明知道什么键入它是如此告诉编译器。 – vadian