Как вы хотите, чтобы отсортировать файлы по номеру, вы должны разобрать первый путь для достижения этой цели, так что давайте предположим, что мы имеем следующий массив 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
недвижимость для извлечения массива со всеми компонентами в пути для NSURL
(например, ["/", "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"
и "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
и componentsSeparatedByString
увеличивают пространство сложность алгоритма sortInPlace
, если вы можете заявить, что путь к файлам всегда будет таким же, кроме имени файла, который должен быть номером, который вы можете используйте вместо этого код:
urls.sortInPlace { $0.absoluteString.compare(
$1.absoluteString, options: .NumericSearch) == .OrderedAscending
}
Я надеюсь, что это поможет вам.
Вам нужно будет использовать функцию 'sort' с пользовательским закрытием, которое указывает, как любая пара данных сравнивается в сортировке. Это закрытие должно было бы проанализировать числа из данных «NSURL» для их сравнения. – Alexander
Просто назовите свои изображения 0001.png, 0002.png, ... он должен работать лучше без сложного программирования – FredericP