import UIKit
struct User: Decodable {
var rank: Int?
var totalxp: Int?
var totalskill: Int?
var combatlevel: Int?
init(json: [String: Any]){
self.rank = json["rank"] as? Int ?? -1
self.totalxp = json["totalxp"] as? Int ?? -1
self.totalskill = json["totalskill"] as? Int ?? -1
self.combatlevel = json["combatlevel"] as? Int ?? -1
}
}
class ViewController: UIViewController {
@IBOutlet var greetingLabel: UILabel!
@IBOutlet var rankLabel: UILabel!
@IBOutlet var totalxpLabel: UILabel!
@IBOutlet var totalskillLabel: UILabel!
@IBOutlet var combatlevelLabel: UILabel!
@IBAction func usernameTextField(_ sender: UITextField) {
let username = sender.text!
greetingLabel.text = "Hello \(String(describing: username))"
parseJson(username: username)
}
override func viewDidLoad() {
super.viewDidLoad()
}
func setValues(rank: Int, totalxp: Int, totalskill: Int, combatlevel: Int){
rankLabel.text = "Rank \(rank)"
totalxpLabel.text = "Total xp \(totalxp)"
totalskillLabel.text = "Total skill \(totalskill)"
combatlevelLabel.text = "Combat \(combatlevel)"
}
func parseJson(username: String){
var jsonUrlString = "https://apps.runescape.com/runemetrics/profile/profile?user= \(username)"
guard var url = URL(string: jsonUrlString) else { return }
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else { return }
do {
var user = try JSONDecoder().decode(User.self, from: data)
}
catch var jsonError {
print("Error serializing json: ", jsonError)
}
}.resume()
setValues(rank: user.rank, totalxp: user.totalxp, totalskill: user.totalskill, combatlevel: user.combatlevel)
}
}
我收到错误:“在这一行使用未解析的标识符'user'”:
setValues(rank: user.rank, totalxp: user.totalxp, totalskill: user.totalskill, combatlevel: user.combatlevel)
我不知道为什么我会收到这个错误,但如果有人能帮助我,我会非常感激!到目前为止,我已经尝试过上层套管“用户”,并且交换var / lets,但似乎没有任何工作;我对swift 4很新,这将是我用它制作的第一个程序 .
func parseJson(username: String){
print("This fired")
let jsonUrlString = "https://apps.runescape.com/runemetrics/profile/profile?user= \(username)"
guard let url = URL(string: jsonUrlString) else { return }
var user: User!
URLSession.shared.dataTask(with: url) { (data, response, error) in
guard let data = data else { return }
do {
print("test")
user = try JSONDecoder().decode(User.self, from: data)
self.setValues(rank: user.rank!, totalxp: user.totalxp!, totalskill: user.totalskill!, combatlevel: user.combatlevel!)
print("User values", user.rank!, user.totalxp!, user.totalskill!, user.combatlevel!)
}
catch let jsonError {
print("Error serializing json: ", jsonError)
}
}.resume()
}
谢谢你的回答 . 我已经清除了我的错误,但由于某些原因,do语句没有解雇,任何人都有任何想法?
2 回答
你在Do func内部的行上声明用户,我建议你把它放在你的变量中,你只能在树下使用变量 .
试试看 .
将
setValues()
放在do块中可以解决问题,但请务必调用[unowned self]
以避免保留周期:如果你需要在ViewController的其他地方,那么在ViewController类本身内创建
user
变量 .