尝试从 json 获取数据时对成员 'jsonObject(with:options:)' 的不明确引用



我是 Swift 的新手,在制作其中一个教程(相当旧)时,该教程涉及通过返回 JSON 的 php 从服务器获取凭据,但我被 json var 中的错误Ambiguous reference to member jsonObject(with:options:)卡住了,我已经搜索并尝试应用不同的解决方案,但无济于事。 :(

感谢您的时间和帮助。

这是我的代码:

let userEmail = userEmailTextField.text;
let userPassword = userPasswordTextField.text;
if((userEmail?.isEmpty)! || (userPassword?.isEmpty)!) {
displayMyAlertMessage(userMessage: "All Fields are required.")
return;
}
let myUrl = URL(string: "/UserLogin.php");
var request = URLRequest(url:myUrl!);
request.httpMethod = "POST";
let postString = "email(userEmail)&password=(userPassword)";
request.httpBody = postString.data(using: String.Encoding.utf8);
let task = URLSession.shared.dataTask(with: request as URLRequest) {
data, URLResponse, error in
if error != nil {
//print = ("error=(error)");
return
}
var err: Error?
var json = JSONSerialization.jsonObject(with: data, options: .mutableContainers, error: &err) as? NSDictionary
if let parseJSON = json {
var resultValue:String = parseJSON["status"] as String!;
print("result: (resultValue)")

if(resultValue == "Success") {
//Login Succesful
UserDefaults.standard.set(true, forKey:"isUserLoggedIn");
UserDefaults.standard.synchronize();
self.dismiss(animated: true, completion: nil);
}
}
}
task.resume()

有两个主要问题:

  1. 发生实际错误的原因是完成块中的response参数错误。而不是类型URLResponse它必须是参数标签/变量。

    let task = URLSession.shared.dataTask(with: request) {  data, response, error in
    
  2. 由于您使用的是 Swift 3,因此jsonObject(with中没有error参数。该方法确实throw,您需要一个do - catch块。而且 - 一如既往 - 选项.mutableContainers在 Swift 中完全无用。省略该参数。

    do {
    if let parseJSON = try JSONSerialization.jsonObject(with: data) as? [String:Any],
    let resultValue = parseJSON["status"] as? String {
    print("result: ", resultValue)
    if resultValue == "Success" {
    //Login Succesful
    UserDefaults.standard.set(true, forKey:"isUserLoggedIn")
    self.dismiss(animated: true, completion: nil)
    }
    }
    } catch {
    print(error)
    }
    

其他一些注意事项:

  • 若要安全地检查文本字段,请使用可选绑定

    guard let userEmail = userEmailTextField.text, !userEmail.isEmpty, let userPassword = userPasswordTextField.text, !userPassword.isEmpty else {
    displayMyAlertMessage(userMessage: "All Fields are required.")
    return
    }
    
  • 将 Swift 常量声明为let(例如resultValue)
  • 不要在 Swift 中使用NSArray / NSDictionary。使用本机类型。
  • 不要在if条件和尾随分号两边使用括号。在 Swift 中不需要它们。
  • 也不需要UserDefaults.standard.synchronize()
  • String.Encoding.utf8可以减少到只有.utf8

最新更新