出于性能的目的,我正在使用多種不同的資料型別,并且希望將一種型別別與另一種單獨的型別別進行比較和排序——它們都包含一個字串值,我該怎么做?
例子:
我正在創建一個帶有表格視圖的視圖控制器,類似于 Facebook 的“已保存”——用戶可以在其中保存專案。然而,他們可以保存的專案之一是用戶。
我有一個類,叫做用戶。
我有一個類,叫做 SavedItem。
Saved Item 正在使用 ObjectMapper,這是 SavedItem 類:
import Foundation
import ObjectMapper
enum SavedItemType: String {
case itemType1 = "itemType1"
case itemType2 = "itemType2"
case itemType3 = "itemType3"
}
class SavedItemModel: Mappable {
var uid: String!
var title: String!
var savedOn: Date!
var type: SavedItemType!
func mapping(map: Map) {
uid <- map["uid"]
type <- map["type"]
title <- map["title"]
savedOn <- (map["savedOn"], SavedItemModel.dateTransform)
}
static let dateTransform = TransformOf<Date, Double>(fromJSON: { value -> Date? in
guard let value = value else { return nil }
return Date(timeIntervalSince1970: value)
},
toJSON: { value -> Double? in
return value?.timeIntervalSince1970
})
required init?(map: Map) {}
}
我在展示帶有 UIContextMenuConfiguration 顯示的新視圖控制器時遇到問題 - 這需要前面提到的“用戶”類的完整資料。此外,我有一些 UI 操作要在應用程式的其他區域執行,因此我必須單獨觸摸資料庫并僅保存保存的用戶的 uid(因此,我已經可以在本地訪問 UID 并且與 SavedItemModel 分開)。
此外,首先,我使用 SavedItem 模型設定表格視圖...每個模型都有一個表格視圖部分,在“型別”上有所不同 - 這非常有效,并且一切正常。
var arySavedUsers = [User]()
var arySavedUserIds = [String]()
var arySavedUserItems = [SavedItemModel]() {
didSet {
tableView.reloadData()
}
}
SavedDataService.shared.fetchSavedUserItems(uid: uid, completion: { (userItems) in
if let userItems = userItems {
let dateSortedItems = userItems.sorted(by: {$0.savedOn > $1.savedOn})
let finalSortedItems = dateSortedItems.sorted(by: {$0.title > $1.title})
self.arySavedUserItems = finalSortedItems
self.user.savedUserItems = finalSortedItems
}
})
然后,我獲取保存的用戶的 uid 并將它們附加到屬性“arySavedUserIds”,我使用表視圖類設定在視圖控制器頂部:
SavedDataService.shared.fetchSavedUsers(uid: uid, completion: { (savedUserIds) in
if let savedUserIds = savedUserIds {
self.arySavedUserIds = savedUserIds
}
for id in self.arySavedUserIds {
FBDataFetcher.shared.fetchUser(id, firQuery: false, removingBlockedAndDeleted: true) { (user) in
guard let user = user else { return }
if !self.arySavedUsers.contains(where: { $0.accountId == user.accountId }) {
self.arySavedUsers.insert(user, at: 0)
}
}
}
})
然后,我設定 cellForRow:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch indexPath.section {
case 0, 1:
let cell = tableView.dequeueReusableCell(withIdentifier: SavedItemTVC.reuseIdentifier, for: indexPath) as! SavedItemTVC
return cell
case 3:
let cell = tableView.dequeueReusableCell(withIdentifier: SavedItemTVC.reuseIdentifier, for: indexPath) as! SavedItemTVC
cell.delegate = self
cell.setUserData(item: arySavedUserItems[indexPath.row])
return cell
然后,我設定 UIContextMenuConfigurationForRowAt 函式:
func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
switch indexPath.section {
case 0, 1: return nil
case 2:
var objUser: User?
if arySavedUsers.count > indexPath.row {
objUser = arySavedUsers[indexPath.row]
} else {
objUser = arySavedUsers[indexPath.row - arySavedUserItems.count]
}
現在,問題是,“用戶”類包含“標題”和“uid”的資料,但它不包含“savedOn”的資料......當然......那么我該如何匹配'arySavedUserItems' 對'arySavedUsers' 的排序?
先感謝您。
uj5u.com熱心網友回復:
您要查找的內容稱為KeyPathComparator. 在對集合進行排序時,您可以根據需要傳遞任意數量的屬性:
let sorted = userItems.sorted(using: [.init(\.savedOn, order: .reverse), .init(\.title, order: .reverse))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/465183.html
