【发布时间】:2017-06-21 17:02:25
【问题描述】:
我有联系人模型,我想通过[firstLetter, fullName] 对 UITableView 进行排序,这样"FAVORITES" 在 startIndex,"#" 在 endIndex,它们之间是排序的字母。
例如:["A", "C", "E", "#", "FAVORITES"] 变成["FAVORITES", "A", "C", "E", "#"]
这是模型
class Contact: Object {
dynamic var fullName = ""
dynamic var firstLetter = ""
}
这是 UITableViewController,我在这里对数据进行排序
class ContactsController: UITableViewController {
// some code
var contacts = try! Realm().objects(Contact.self).filter("isDeleted == false").sorted(by: ["firstLetter","fullName"])
var sections: [String] {
return Set(contacts.value(forKeyPath: "firstLetter") as![String]).sorted()
}
override func viewDidLoad() {
super.viewDidLoad()
setUI()
}
// another code
}
编辑#1
抱歉,我忘了说“#”包含全名以特殊字符开头的联系人
回答我的问题
var sections: [String] {
return Set(contacts.value(forKeyPath: "firstLetter") as![String]).sorted {
//Favourites sorts before all else
if $0 == "FAVORITES" { return true }
if $1 == "FAVORITES" { return false }
// Symbols sort after all else
if $0 == "#" { return false }
if $1 == "#" { return true }
return $0 < $1
}
}
【问题讨论】:
-
为什么不将属性 isFavorite 添加到联系人。然后有两个数组用于收藏夹和非收藏夹。按字母排序,然后将它们连接起来。
-
感谢您的建议。那么“#”呢,我存储以特殊字符开头的联系人?我认为这是一个不好的做法。
-
@SahandTheGreat,如果您将
isFavorite属性添加到Contact,则不需要两个单独的数组,因为您可以像contacts.filter{ $0.isFavorite }一样过滤它们或contacts.filter{ !$0.isFavorite }. -
如果
Contact已经在fullName中,为什么要存储第一个字母? -
@Alexander 这很奇怪,但是 Realm 不支持非拉丁字符串的大小写忽略,所以我将 fullName 的第一个字母转换为 upperCase() 以在任何情况下都相似