我是 Swift 新手,在制作其中一个教程(相当旧)时,其中涉及通过返回 JSON 的 php 从服务器获取凭据,但我遇到了错误 对成员 jsonObject 的模糊引用(with:options:)
在 json var 中,我搜索并尝试应用不同的解决方案,但无济于事。 :(
感谢您的时间和帮助。
这是我的代码:
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()
最佳答案
有两个主要问题:
实际发生错误是因为完成 block 中的
response
参数错误。它必须是参数标签/变量,而不是URLResponse
类型。let task = URLSession.shared.dataTask(with: request) { data, response, error in
由于您使用的是 Swift 3,因此
jsonObject(with
中没有error
参数。该方法会抛出
,您需要一个do - catch
block 。而且,与往常一样,选项.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) }
其他一些注意事项:
要安全地检查文本字段,请使用可选绑定(bind)
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
。
关于json - 尝试从 json 获取数据时对成员 `jsonObject(with:options:)` 的引用不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44937336/