当您想按数字对文件进行排序时,您必须首先解析路径才能实现它,所以假设我们有以下数组NSURL
对象:
var urls = [NSURL(string: "file:///path/to/user/folder/2.PNG")!, NSURL(string: "file:///path/to/user/folder/100.PNG")!, NSURL(string: "file:///path/to/user/folder/101.PNG")!, NSURL(string: "file:///path/to/user/folder/1.PNG")! ]
我们可以使用pathComponents https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/#//apple_ref/occ/instp/NSURL/pathComponents属性来提取包含路径中所有组件的数组NSURL
(e.g ["/", "path", "to", "user", "folder", "2.PNG"]
).
如果我们看到,我们可以按数组中的最后一个元素对文件进行排序,该元素是文件名,删除扩展名和点("."
),在本例中为数字。让我们看看如何在下面的代码中做到这一点:
urls.sortInPlace {
// number of elements in each array
let c1 = $0.pathComponents!.count - 1
let c2 = $1.pathComponents!.count - 1
// the filename of each file
var v1 = $0.pathComponents![c1].componentsSeparatedByString(".")
var v2 = $1.pathComponents![c2].componentsSeparatedByString(".")
return Int(v1[0]) < Int(v2[0])
}
在上面的代码中我们使用了函数sortInPlace
以避免创建另一个元素已排序的数组,但是您可以使用sort
相反,如果你愿意的话。代码中的另一个重要点是这一行return Int(v1[0]) < Int(v2[0])
,在这一行中我们必须将字符串中的数字转换为实数,因为如果我们比较两个字符串"2"
and "100"
第二个小于大于,因为字符串是按字典顺序比较的。
所以数组urls
应该像下面这样:
[file:///path/to/user/folder/1.PNG, file:///path/to/user/folder/2.PNG, file:///path/to/user/folder/100.PNG, file:///path/to/user/folder/101.PNG]
EDIT:
两个函数pathComponents
and componentsSeparatedByString
增加空间复杂度sortInPlace
算法,如果您可以确保文件的路径始终相同,除了文件名应该是数字之外,您可以使用以下代码:
urls.sortInPlace { $0.absoluteString.compare(
$1.absoluteString, options: .NumericSearch) == .OrderedAscending
}
我希望这对你有帮助。