Swift4 - 错误域=NSCocoaErrorDomain 代码=4865

Posted

技术标签:

【中文标题】Swift4 - 错误域=NSCocoaErrorDomain 代码=4865【英文标题】:Swift4 - Error Domain=NSCocoaErrorDomain Code=4865 【发布时间】:2018-07-21 21:05:45 【问题描述】:
func DoLogin(_ email:String, _ password:String)


        struct user : Decodable 
            let userid: Int
            let sfname: String
            let slname: String
            let email: String
            let sid: Int
        


    let url = URL(string: ".....")!
    var request = URLRequest(url: url)
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.httpMethod = "POST"
    let postString = "email=" + email + "&password=" + password + ""
    request.httpBody = postString.data(using: .utf8)
    let task = URLSession.shared.dataTask(with: request)  data, response, error in
        guard let data = data, error == nil else                                                  // check for fundamental networking error
            print(error!)
            return
        

        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200            // check for http errors
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print(response!)
        

       let responseString = String(data: data, encoding: .utf8)
     print(responseString!)
        do 
            let myStruct = try JSONDecoder().decode(user.self, from: data)
            print(myStruct)


         catch let error as NSError 
            print(error)

        
    


    task.resume()

所以目标是将 JSON 响应保存到“用户”类中,这样我就可以使用变量将数据插入到 sql 数据库中。我目前遇到的问题是错误消息...

"Error Domain=NSCocoaErrorDomain Code=4865"没有与 key userid ("userid") 关联的值。" UserInfo=NSCodingPath=( ), NSDebugDescription=没有与关键用户 ID ("userid") 关联的值。"

我觉得问题在于 HTTP 响应以数组形式返回数据,然后无法解码(下面列出的 HTTP 响应是我一直用于测试目的的 responseString)

"user":"userid":2,"sfname":"John","slname":"Doe","email":"john@doe.com","sid":123456

这是用于返回数据的 php

    public function getUserByEmail($email)

    $stmt = $this->conn->prepare("SELECT userid, sfname, slname, email, sid FROM students WHERE email = ?");
    $stmt->bind_param("s", $email);
    $stmt->execute();
    $stmt->bind_result($userid, $sfname, $slname, $email, $sid);
    $stmt->fetch();
    $user = array();
    $user['userid'] = $userid;
    $user['sfname'] = $sfname;
    $user['slname'] = $slname;
    $user['email'] = $email;
    $user['sid'] = $sid;
    return $user;

提前致谢:D

【问题讨论】:

【参考方案1】:

正如您已经提到自己的那样,您的 JSON 的结构与您的 user 结构的结构不匹配。

您可以做两件事:尝试找出返回的 JSON 包装在另一个 JSON 对象中的原因,或者创建一个与接收到的 JSON 的结构相匹配的包装器结构。

第二种方法应该是这样的:

struct UserWrapper: Decodable 
  let user:user

那么当你从 JSON 简单地创建你的用户时

let wrapper = try JSONDecoder().decode(UserWrapper.self, from: data)
myStruct = wrapper.user

顺便说一句:我建议你阅读 Swift 风格指南。按照惯例,函数名称应以小写字母开头,类/结构名称应以大写字母开头。 函数中的命名参数也是记录代码的一件非常酷的事情。

类似

func doLogin(userWithMail email: String, andPassword password: String) ...
// ... other stuff
// call
doLogin(userWithMail: "test@test.com", andPassword: "1234567")

可能更具可读性。以防万一您将来必须共享您的代码库。 ;D

【讨论】:

以上是关于Swift4 - 错误域=NSCocoaErrorDomain 代码=4865的主要内容,如果未能解决你的问题,请参考以下文章

核心数据错误 1550

Swift4滚动UITableview后,动画UITableview框架是错误的

Swift4 中的 RxCocoa 映射可选错误,带有“无法转换类型“字符串?”的值

在 Xcode 10.2 上的 Swift4.2 中插入 NSManagedObject 后,我​​会立即收到 Xcode 构建错误

Swift 4,CoreData:错误:无法加载名为 textTabelView 的模型

操作观察期间的 Swift 4 KVO 致命错误