我是 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()
有两个主要问题:
-
发生实际错误的原因是完成块中的
response
参数错误。而不是类型URLResponse
它必须是参数标签/变量。let task = URLSession.shared.dataTask(with: request) { data, response, error in
-
由于您使用的是 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
。