我是 Swift 新手,在制作其中一个教程(相当旧)时涉及通过返回 JSON 的 php 从服务器获取凭据,但我遇到了错误Ambiguous reference to member 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()
有两个主要问题:
-
实际发生错误是因为response
完成块中的参数错误。而不是类型URLResponse
它必须是参数标签/变量。
let task = URLSession.shared.dataTask(with: request) { data, response, error in
-
由于您使用的是 Swift 3,因此没有error
参数输入jsonObject(with
。该方法确实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
)
- 不使用
NSArray / NSDictionary
在斯威夫特.使用本机类型。
- 不要使用括号
if
条件和尾随分号。 Swift 中不需要它们。
-
UserDefaults.standard.synchronize()
也不需要。
-
String.Encoding.utf8
可以简化为.utf8
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)