因此,我试图在应用程序本身的标签中打印JSON
响应(或textField
并不重要)。我可以毫无问题地打印到控制台,但是我无法将JSON
响应设置为标签文本。这是我的代码。
URLSession.shared.dataTask(with: request) { (data, response, error) in
// print("Data, response, error", data, response, error)
if let data = data {
let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: String] ?? [:]
print("json", json)
let token = json?["token"] as? String ?? ""
UserDefaults.standard.set(token, forKey: "token")
UserDefaults.standard.set(true, forKey: "signedIn")
}
//print("Data, response, error", data, response, error)
}.resume()
如果我尝试做label.text = ("json", json)
,则会收到错误消息
无法设置类型[String:String]?作为字符串
我该怎么办?谢谢!
答案 0 :(得分:1)
错误指示cannot set type [String: String]? as String
意味着您无法将[String: String]?
设置为UILabel
,因为label.text
仅接受String
值。
要解决此问题,您需要从String
字典中获得json
值。像这样:
let yourString = json["keyYouWantToAccess"]
,然后将其分配给您的label
文本,例如:
label.text = yourSting
在处理如下所示的API调用时,请不要忘记在主线程中更新UI
:
DispatchQueue.main.async {
//Update your UI here
self.label.text = yourSting
}
答案 1 :(得分:0)
label.text
的类型为String
,而("json", json)
的类型为(String, [String:String]?)
。您需要这样分配:
if let json = json {
let string = "json \(json)"
label.text = string
}
并按照Dharmesh Kheni的回应执行线程指令。
答案 2 :(得分:0)
您必须执行与使用“ token”变量完全相同的过程。例如,如果要为UILabel设置用户ID,并且JSON正在检索的数据包含用户ID的键为“ userId”,则请执行以下操作:
var userID = json?["userId"] as? String ?? ""
现在,将该用户ID设置为您的UILable:
label.text = userID
就这样。编码愉快。