在swift中对字符串数组进行排序

时间:2015-02-23 21:43:23

标签: ios sorting swift

我在排序字符串数组时遇到问题。我尝试排序的数组派生自NSMutableDictionary中的所有键。我认为我的主要问题是价值的关键" AnyObject"而那干扰了我的排序功能。这是我到目前为止所尝试的内容:

    var sections = self.sortedFriends.allKeys

尝试1

    sort(&sections) {$0 < $1}

尝试2

    self.sectionTitles = sections.sorted({ (str1:NSString, str2:NSString) -> Bool in
                    return str1 < str2
                })

我一直收到错误&#34; AnyObject不是NSString&#34;的子类型。在Objective-C中,很容易使用caseInsensitiveCompare函数,但似乎不再是这种情况。如果有人可以帮助我,我会很感激。谢谢!

2 个答案:

答案 0 :(得分:4)

您需要将[AnyObject]转换为可以实际比较的内容。您可以在获取密钥时执行此操作:

// as? will return nil if any of the keys are not Strings, this substitutes
// an empty array in that case - you may want different handling
var sections = (self.sortedFriends.allKeys as? [String]) ?? []

或逐个投射每个元素:

// here, if an individual key is not a String, as? will 
// return nil.  nil is always < non-nil
sort(&sections) { ($0 as? String) < ($1 as? String) }

后者的好处是它可以处理如果一个单独的元素不是String - as?将返回nilnil总是小于非-nil所以你的非字符串值会将一端分组。

特别是字符串,还有另外一个选项:

// with the as? String version above, 5 would come before "4"
let nsm = [3:"4", 2:5] as NSMutableDictionary
var sections = nsm.allValues
// but in this case, both are converted to strings and sort correctly
sort(&sections) { toString($0) < toString($1) }

答案 1 :(得分:3)

尝试将其强制转换为字符串,因为现在,它实际上是一个[NSObject]类型的数组。由于接受<的{​​{1}}运算符没有重载,因此它不知道该怎么做。

NSObject