Ios 无法强制转换类型为'__NSArray0';至';NSDictionary';
当我解析json响应时 这是我的错误 无法将类型为“\uu NSArray0”(0x104bcd838)的值强制转换为“NSDictionary”(0x104bcf818) 这是我的密码Ios 无法强制转换类型为'__NSArray0';至';NSDictionary';,ios,Ios,当我解析json响应时 这是我的错误 无法将类型为“\uu NSArray0”(0x104bcd838)的值强制转换为“NSDictionary”(0x104bcf818) 这是我的密码 @IBAction func LoginAction(_ sender: Any) { let parameters: Parameters=[ "email":emailUser.text!, "password":passWord.text!,
@IBAction func LoginAction(_ sender: Any) {
let parameters: Parameters=[
"email":emailUser.text!,
"password":passWord.text!,
]
let url2 = "http://marwen1994.alwaysdata.net/Carpooling/public/loginpost.php"
Alamofire.request(url2, method: .post, parameters: parameters).responseJSON
{
response in
let A = response.result.value as! Dictionary<String,Any>
let list = A["items"] as! Dictionary<String,Any>
let nom = list["name"] as! String
let pass = A["password"] as! String
let email = list["email"] as! String
let adresse = A["adresse"] as! String
let DateNaissance = A["DateNaissance"] as! String
let id = A["id"] as! Int
let numTel = A["num_tel"] as! Int
if(pass == self.passWord.text)
{
UserDefaults.standard.set(true, forKey: "ConnectionStatus")
UserDefaults.standard.set(id, forKey: "ConnectedID")
UserDefaults.standard.set(nom, forKey: "nom")
// UserDefaults.standard.set(prenom, forKey: "prenom")
UserDefaults.standard.set(email, forKey: "email")
UserDefaults.standard.set(adresse, forKey: "adresse")
UserDefaults.standard.set(pass, forKey: "motDePasse")
UserDefaults.standard.set(numTel, forKey: "numTel")
UserDefaults.standard.set(DateNaissance, forKey: "DateNaissance")
self.performSegue(withIdentifier: "toProfile", sender: nil)
}
else{
let alert = UIAlertController(title: "Woah!!!", message: "You inserted a wrong email or a wrong password! Please enter a valid mail and password.", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
self.present(alert, animated: true)
}
}
}
@iAction func登录操作(\发送方:任意){
let参数:参数=[
“email”:emailUser.text!,
“密码”:密码。文本!,
]
让url2=”http://marwen1994.alwaysdata.net/Carpooling/public/loginpost.php"
请求(url2,方法:.post,参数:parameters).responseJSON
{
回应
设A=response.result.value为!Dictionary
将list=A[“items”]设为!字典
让nom=list[“name”]作为!字符串
将[“密码”]作为!字符串传递
让email=将[“email”]列为!字符串
设ADRESE=A[“ADRESE”]为!字符串
让DateNaissance=A[“DateNaissance”]作为!字符串
设id=A[“id”]as!Int
设numTel=A[“num_tel”]为!Int
if(pass==self.passWord.text)
{
UserDefaults.standard.set(true,forKey:“ConnectionStatus”)
UserDefaults.standard.set(id,forKey:“ConnectedID”)
UserDefaults.standard.set(nom,forKey:“nom”)
//UserDefaults.standard.set(prenom,forKey:“prenom”)
UserDefaults.standard.set(email,forKey:“email”)
UserDefaults.standard.set(adresse,forKey:“adresse”)
UserDefaults.standard.set(pass,forKey:“motDePasse”)
UserDefaults.standard.set(numTel,forKey:“numTel”)
UserDefaults.standard.set(DateNaissance,forKey:“DateNaissance”)
self.performsgue(标识符为“toProfile”,发送方:nil)
}
否则{
让alert=UIAlertController(标题:“哇!!!”,消息:“您插入了错误的电子邮件或密码!请输入有效的邮件和密码。”,首选样式:。alert)
addAction(UIAlertAction(标题:“确定”,样式:。取消,处理程序:nil))
self.present(警报、动画:true)
}
}
}
如果看不到实际的JSON响应,很难知道错误在哪里,但这可能是一个数组而不是字典
let list = A["items"] as! Dictionary<String,Any>
如果您可以考虑使用<代码>可编辑< /代码>,这可能有助于
struct JsonResponse: Decodable {
let items: [Item]
}
struct Item: Decodable {
let id: String
let name: String
let email: String
let encrypted_password: String
let num_tel: String
let adresse: String
let DateNaissance: String
}
实际解码是这样完成的
let decoder = JSONDecoder()
do {
let jsonResponse = try decoder.decode(JsonResponse.self, from: data)
for item in jsonResponse.items {
UserDefaults.standard.set(item.name, forKey: "nom")
UserDefaults.standard.set(item.email, forKey: "email")
//and so on
}
} catch {
print("Decode error: \(error)")
}
data
是response
中的json消息,我不知道Alamofire是如何工作的,所以您需要自己弄清楚如何正确访问它
“items”中有一个数组,只有一个元素,可以像
if let A = response.result.value as? Dictionary<String,Any>, let list = A["items"][0] as? Dictionary<String,Any> {
}
如果让A=response.result.value为?字典,让list=A[“items”][0]作为?字典{
}
这个错误很明显,不是吗<代码>设A=response.result.value为!字典。json响应是什么样子的?{“items”:[{“id”:“14”,“unique_id”:“5bb7682e2031f7.15799495”,“name”:“test”,“email”:test@test.com,“加密密码”:“5HQXUSQX1GYMO5ZVORVJBKHVFMXOTQWYMYWM2EW”,“salt”:“1940bf03a0”,“创建于”:“2018-10-05 15:33:34”,“更新时间:null”,“电话号码”:“+2169502248”,“图片”:“14”,“地址”:“突尼斯阿里亚纳”,“出生日期”:“12/14/2018”}]}所以,A[“项目”]
是一个包含字典而不是字典本身的数组。一般来说,除非你真的知道正确的类型,否则不要使用!
。(学习)阅读JSON。这非常简单。只有两种集合类型:[]
是数组(Swift[[String:Any]
或[dictionary]
),{}
是字典(Swift[String:Any]
或字典
).{“items”:[{“id”:“14”,“unique_id”:“5bb7682e2031f7.15799495”,“name”:“test”,“email”:test@test.com,“加密密码”:“5HQXUSQX1GYMO5ZVORVJBKHVFMXOTQWYMYWM2EW“,”salt“:”1940bf03a0“,”created_at:”2018-10-05 15:33:34“,”updated_at:”null“,”num_tel“,”2169502248“,”image“,”14“,”adrese“:”tunis ariana“,”DateNaissance“:”12/14/2018“}”)这是JSOn响应是的,我说的,items是一个数组,不是字典,因为它只有一个元素,您可以按以下方式执行let list=a[“items”][0]!作为!Dictionary
,但是如果您管理服务器并且它只返回一个项目,我会将其更改为返回对象(Dictionary)而不是数组。您将密码返回到应用程序也不好这是我的jsonresponse{“items”:[{“id”:“14”,“unique_id”:“5bb7682e2031f7.15799495”,“name”:“test”,“email”:test@test.com,“加密密码”:“5HQXUSQX1GYMO5ZVORVJBKHVFMXOTQWYMYWM2EW”,“salt”:“1940bf03a0”、“创建时间”:“2018-10-05 15:33:34”、“更新时间”:“空”、“数字电话”:“+2169502248”、“图像”:“14”、“地址”:“突尼斯阿里亚纳”、“出生日期”:“2018年12月14日”}
if let A = response.result.value as? Dictionary<String,Any>, let list = A["items"][0] as? Dictionary<String,Any> {
}