【问题标题】:Compare the key with array of dictionaries in iOS swift 4将键与 iOS swift 4 中的字典数组进行比较
【发布时间】:2018-10-17 00:45:06
【问题描述】:

我正在尝试将 studentId 与具有多个 studentId 的字典数组进行比较。我需要获取与特定 StudentID 匹配的字典。任何人都可以提出完美的解决方案。我是 swift 新手。

"students" : [
    {
      "studentId" : "STUDENT123456789",
      "middleName" : "Evangeline",
      "firstName" : "Dia",
      "rollNo" : "1001",
      "studentClass" : {
        "className" : "Grade 10",
        "classId" : "CLASS123456789",
      }
    }
  {
      "studentId" : "STUDENT14354678960",
      "middleName" : "Joseph",
      "firstName" : "Parker",
      "rollNo" : "1002",
      "studentClass" : {
        "className" : "Grade 10",
        "classId" : "CLASS15468975467",
      }
    }
  ]

我有学生数组,它是一个字典数组。现在我必须将学生 ID 与包含多个学生 ID 的现有数组进行比较。所以当它与学生 ID 匹配时,我需要获取特定的字典数据。 例如,我的 studentId 为“STUDENT14354678960”,所以我需要获取包含与此 Id 相关的数据..

【问题讨论】:

    标签: ios arrays dictionary swift4


    【解决方案1】:

    使用first,它返回第一个找到的对象或nil

    if let student = students.first(where: {$0["studentId"] as! String == "STUDENT123456789"}) {
       print(student["firstName"])
    } else {
       print("not found")
    }
    

    强烈建议为学生数据使用自定义结构或类

    let jsonString = """
    {"students" : [
    {"studentId" : "STUDENT123456789", "middleName" : "Evangeline", "firstName" : "Dia", "rollNo" : "1001", "studentClass" : { "className" : "Grade 10", "classId" : "CLASS123456789"}},
    {"studentId" : "STUDENT14354678960", "middleName" : "Joseph", "firstName" : "Parker", "rollNo" : "1002", "studentClass" : {"className" : "Grade 10", "classId" : "CLASS15468975467"}}
    ]}
    """
    
    struct Root : Decodable {
        let students : [Student]
    }
    
    struct Student : Decodable {
        let studentId, middleName, firstName, rollNo : String
        let studentClass : StudentClass
    }
    
    struct  StudentClass : Decodable {
        let className, classId : String
    }
    
    let data = Data(jsonString.utf8)
    do {
        let result = try JSONDecoder().decode(Root.self, from: data)
        let students = result.students
        if let student = students.first(where: {$0.studentId == "STUDENT123456789" }) {
            print(student)
        }
    } catch {
        print(error)
    }
    

    【讨论】:

    • 实际上,我将学生数据存储在 UserDefaults 中并使用 key .. let defaults = UserDefaults.standard 获取。让 studentData = defaults.value(forKey: "ClassStudents") 为!数据。让 studentsArray = NSKeyedUnarchiver.unarchiveObject(with: studentData) 为! NSArray
    • 不要在 Swift 中使用NSArray,你是在丢掉类型信息,使用[[String:Any]]
    • 哦,好的,谢谢!我改为 [String:Any] ..所以上述解决方案可以适合我的地方。我没有jsonString。我应该将 [String:Any] 转换为字符串类型吗?...它显示错误“[String:Any] 类型的值”没有成员“utf8”
    • 问题中的数据类型是 JSON,所以我假设您从网络中检索数据。您可以使用 JSONSerialization 将字典转换为 JSON,然后解码为结构。
    • 嗯是的!我已经从网络中检索到数据,并且我将数据以 NSKeyedArchiver 的形式存储在 userDefaults 中,方法是提供密钥名称并通过 NSKeyedUnarchiver 在另一个视图中获取数据..我正在使用 Alamofire 和 SwiftyJson
    【解决方案2】:

    你可以使用 where 闭包:

    let search = students.first { (element) -> Bool in
        if let dict = element as? [String:Any] {
            return dict["studentId"] == yourID
        }
    }
    

    【讨论】:

    • 返回字典附近显示错误“Type Any 没有下标成员”
    • 你如何声明你的数组?
    • 实际上,我通过提供密钥并使用 NSKeyedUnarchiver 获取将字典存储在用户默认值中
    • @HarryP 您需要在数组和字典中设置数据类型,请参阅我编辑的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 2018-10-05
    • 2021-04-13
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多