Ответ 1
редактирование/обновление: Xcode 10.2.x • Swift 5
Вы можете использовать метод String localizedStandardCompare
let array = [ "10", "1", "101", "NA", "100", "20", "210", "200", "NA", "7" ]
let sorted = array.sorted {$0.localizedStandardCompare($1) == .orderedAscending}
print(sorted) // ["1", "7", "10", "20", "100", "101", "200", "210", "NA", "NA"]
или используя метод sort(by:)
для коллекции MutableCollection:
var array = [ "10", "1", "101", "NA", "100", "20", "210", "200", "NA", "7" ]
array.sort {$0.localizedStandardCompare($1) == .orderedAscending}
print(array) // ["1", "7", "10", "20", "100", "101", "200", "210", "NA", "NA"]
Вы также можете реализовать свой собственный локализованный стандартный метод сортировки, расширяющий коллекцию:
extension Collection where Element: StringProtocol {
public func localizedStandardSorted(_ result: ComparisonResult) -> [Element] {
return sorted { $0.localizedStandardCompare($1) == result }
}
}
let array = [ "10", "1", "101", "NA", "100", "20", "210", "200", "NA", "7" ]
let sorted = array.localizedStandardSorted(.orderedAscending)
print(sorted) // ["1", "7", "10", "20", "100", "101", "200", "210", "NA", "NA"]
Метод мутирования, а также расширение MutableCollection:
extension MutableCollection where Element: StringProtocol, Self: RandomAccessCollection {
public mutating func localizedStandardSort(_ result: ComparisonResult) {
sort { $0.localizedStandardCompare($1) == result }
}
}
var array = [ "10", "1", "101", "NA", "100", "20", "210", "200", "NA", "7" ]
array.localizedStandardSort(.orderedAscending)
print(array) // ["1", "7", "10", "20", "100", "101", "200", "210", "NA", "NA"]
Если вам нужно отсортировать массив численно, вы можете использовать метод сравнения строк, установив для параметра options значение .numeric
:
public extension Collection where Element: StringProtocol {
func sortedNumerically(_ result: ComparisonResult) -> [Element] {
return sorted { $0.compare($1, options: .numeric) == result }
}
}
public extension MutableCollection where Element: StringProtocol, Self: RandomAccessCollection {
mutating func sortNumerically(_ result: ComparisonResult) {
sort { $0.compare($1, options: .numeric) == result }
}
}
var numbers = ["1.5","0.5","1"]
let sorted = numbers.sortedNumerically(.orderedAscending)
print(sorted) // ["0.5", "1", "1.5"]
print(numbers) // ["1.5","0.5","1"]
// mutating the original collection
numbers.sortNumerically(.orderedDescending)
print(numbers) // "["1.5", "1", "0.5"]\n"