I have some data like this :
1, 111, 2, 333, 45, 67, 322, 4445
NSArray *array = [[myData allKeys]sortedArrayUsingSelector: @selector(compare:)];
David's answer did the trick for me. For what it's worth, I want to share the Swift 1.0 version of the same answer.
extension NSString {
func psuedoNumericCompare(otherString: NSString) -> NSComparisonResult {
var left: NSString = self
var right: NSString = otherString
var leftNumber: Int = self.integerValue
var rightNumber: Int = otherString.integerValue
var leftScanner: NSScanner = NSScanner(string: left)
var rightScanner: NSScanner = NSScanner(string: right)
if leftScanner.scanInteger(&leftNumber) && rightScanner.scanInteger(&rightNumber) {
if leftNumber < rightNumber {
return NSComparisonResult.OrderedAscending
}
if leftNumber > rightNumber {
return NSComparisonResult.OrderedDescending
}
left = left.substringFromIndex(leftScanner.scanLocation)
right = right.substringFromIndex(rightScanner.scanLocation)
}
return left.caseInsensitiveCompare(right)
}
}