Swift3中如何比较并匹配两个不同结构的数组?
解决Swift3中数组匹配的问题
嘿,作为Swift新手碰到数组匹配的需求完全不用慌,我来给你一步步拆解怎么实现~
首先先明确你的需求:从DetailsArray里筛选出**bookId存在于IdListArray**中的书籍条目对吧?结合你给出的示例数据,最终应该会得到包含abcd和ijkl对应那两个字典的新数组。
步骤1:处理IdListArray,转成Swift原生数组
你给出的IdListArray是可选的NSMutableArray,在Swift里用原生数组会更顺手,所以先解包并转换类型:
// 先确保IdListArray能正常解包并转成[String]类型 guard let idList = IdListArray as? [String] else { print("IdListArray格式不符合预期,无法转换") return }
步骤2:筛选DetailsArray中的匹配元素
假设你的DetailsArray是[[String: Any]]类型(也就是字典组成的数组),我们可以用Swift的filter方法来快速筛选:
// 筛选出bookId在idList中的条目 let matchedBooks = DetailsArray.filter { bookDict in // 从字典中取出bookId并转成String类型 guard let bookId = bookDict["bookId"] as? String else { return false // 如果取不到bookId或者类型不对,直接排除 } return idList.contains(bookId) } // 打印结果看看 print("匹配到的书籍:\(matchedBooks)")
进阶:用自定义模型让代码更清晰
如果你的项目里经常要处理书籍数据,建议把字典转成Swift结构体,代码会更易读也更安全:
// 定义Book模型 struct Book { let bookId: String let bookName: String let bookThumbImage: String // 从字典初始化模型的方法 init?(dict: [String: Any]) { // 确保所有字段都能正确取出并转换类型 guard let id = dict["bookId"] as? String, let name = dict["bookName"] as? String, let thumbImage = dict["bookThumbImage"] as? String else { return nil // 字段不全或者类型不对就返回nil } self.bookId = id self.bookName = name self.bookThumbImage = thumbImage } }
然后把DetailsArray转成[Book]数组(Swift3里用flatMap过滤掉初始化失败的元素):
let books = DetailsArray.flatMap { Book(dict: $0) }
现在筛选就变得非常简洁了:
let matchedBooks = books.filter { idList.contains($0.bookId) }
这样写出来的代码不仅更易懂,还能避免很多类型转换的坑,特别适合新手养成良好的编码习惯~
内容的提问来源于stack exchange,提问作者MuraliDharan V
相关产品推荐
相关产品推荐

