【发布时间】:2017-11-23 12:14:51
【问题描述】:
我想按表格视图中媒体项的标题对数据进行排序,但我想按第一个“实际”字母对数据进行排序,而不是像“the”或“an”这样的常见文章
- 民谣
- 红胡子海贼之歌
- 黑胡子海贼之歌
- 钢球
我尝试了以下解决方案:
extension String {
func firstLetter() -> Character{
var tmp = self.lowercased()
if tmp.hasPrefix("the "){
tmp = String(tmp.characters.dropFirst(4))
}else if tmp.hasPrefix("a "){
tmp = String(tmp.characters.dropFirst(2))
}else if tmp.hasPrefix("an "){
tmp = String(tmp.characters.dropFirst(3))
}
let hmm = "aąbcćdeęfghijklmnoópqrsśtuvwxyzżź0123456789"
let letters = Array(hmm.characters)
for index in characters.indices{
if letters.contains(tmp[index]){
return tmp[index]
}
}
return "_"
}
func firstSpecial() -> Bool {
let characterset = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
if prefix(1).rangeOfCharacter(from: characterset.inverted) != nil {
return true
}else{
return false
}
}
func firstNumber() -> Bool {
if lowercased().hasPrefix("the "){
return Int(dropFirst(4).prefix(1)) != nil
}else if lowercased().hasPrefix("a "){
return Int(dropFirst(2).prefix(1)) != nil
}else if lowercased().hasPrefix("an "){
return Int(dropFirst(3).prefix(1)) != nil
}else{
return Int(prefix(1)) != nil
}
}
}
songs = [MPMediaItem]()
result = [String: [MPMediaItem]]()
indexes = [String]()
func setup(){
var numbers = false
var special = false
songs = musicQuery.shared.songs
for song in songs {
var key = ""
if song.title!.firstNumber() {
print(song.title)
key = "#"
if result[key] != nil {
result[key]?.append(song)
}else{
result[key] = []
result[key]?.append(song)
numbers = true
}
}else if !(song.title?.firstSpecial())! {
key = String(describing: song.title?.firstLetter()).uppercased()
if result[key] != nil {
result[key]?.append(song)
}else{
result.updateValue([song], forKey: key)
indexes.append(key)
}
}else{
print(song.title)
key = "?"
if result[key] != nil {
result[key]?.append(song)
}else{
result[key] = []
result[key]?.append(song)
special = true
}
}
}
indexes = indexes.sorted { $0.compare($1) == ComparisonResult.orderedAscending }
if numbers {
indexes.append("#")
}
if special {
indexes.append("?")
}
}
但这远非最佳,需要很长时间才能完成并且省略了一些条目
【问题讨论】: