首页 文章

使用未解析的标识符'user'

提问于
浏览
-2
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 回答

  • 0

    你在Do func内部的行上声明用户,我建议你把它放在你的变量中,你只能在树下使用变量 .

    试试看 .

    class ViewController: UIViewController {
    
        var user = //declare here
        @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 {
            //change user value here
            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)
    }
    
    }
    
  • 0

    setValues() 放在do块中可以解决问题,但请务必调用 [unowned self] 以避免保留周期:

    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 {
            let user = try JSONDecoder().decode(User.self, from: data)
            Dispatch.mainQueue.async { [unowned self] in
              self.setValues(rank: user.rank, totalxp: user.totalxp, 
                            totalskill: user.totalskill, combatlevel: user.combatlevel)
            }
    
        }
        catch var jsonError {
            print("Error serializing json: ", jsonError)
        }
    
      }.resume()
    }
    

    如果你需要在ViewController的其他地方,那么在ViewController类本身内创建 user 变量 .

相关问题