假设我们有一个名为imageFile的自定义类,这个类包含两个属性:
class imageFile {
var fileName = String()
var fileID = Int()
}
很多都存储在一个数组中:
var images : Array = []
var aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 101
images.append(aImage)
aImage = imageFile()
aImage.fileName = "image1.png"
aImage.fileID = 202
images.append(aImage)
我如何排序的图像数组由'fileID'升序或降序?
使用KeyPath排序
你可以像这样通过KeyPath排序:
myArray.sorted(by: \.fileName, <) /* using `<` for ascending sorting */
通过实现这个有用的扩展。
extension Collection{
func sorted<Value: Comparable>(
by keyPath: KeyPath<Element, Value>,
_ comparator: (_ lhs: Value, _ rhs: Value) -> Bool) -> [Element] {
sorted { comparator($0[keyPath: keyPath], $1[keyPath: keyPath]) }
}
}
希望Swift在不久的将来把这个添加到语言的核心中。
如果你不使用自定义对象,而是使用值类型来实现可比协议(Int, String等),你可以简单地这样做:
myArray.sort(>) //sort descending order
一个例子:
struct MyStruct: Comparable {
var name = "Untitled"
}
func <(lhs: MyStruct, rhs: MyStruct) -> Bool {
return lhs.name < rhs.name
}
// Implementation of == required by Equatable
func ==(lhs: MyStruct, rhs: MyStruct) -> Bool {
return lhs.name == rhs.name
}
let value1 = MyStruct()
var value2 = MyStruct()
value2.name = "A New Name"
var anArray:[MyStruct] = []
anArray.append(value1)
anArray.append(value2)
anArray.sort(>) // This will sort the array in descending order
Swift 4.0, 4.1和4.2:
首先,我创建了imageFile类型的可变数组,如下所示
var arr = [imageFile]()
创建类型为imageFile的可变对象图像,并为属性赋值,如下所示
var image = imageFile()
image.fileId = 14
image.fileName = "A"
现在,将这个对象追加到数组arr
arr.append(image)
现在,将不同的属性分配给相同的可变对象,即图像
image = imageFile()
image.fileId = 13
image.fileName = "B"
现在,再次将image object追加到数组arr中
arr.append(image)
现在,我们将对数组arr对象中的fileId属性应用升序。使用<符号按升序排列
arr = arr.sorted(by: {$0.fileId < $1.fileId}) // arr has all objects in Ascending order
print("sorted array is",arr[0].fileId)// sorted array is 13
print("sorted array is",arr[1].fileId)//sorted array is 14
现在,我们将在数组arr对象中的fileId属性上应用降序。降序使用>符号
arr = arr.sorted(by: {$0.fileId > $1.fileId}) // arr has all objects in Descending order
print("Unsorted array is",arr[0].fileId)// Unsorted array is 14
print("Unsorted array is",arr[1].fileId)// Unsorted array is 13
在Swift 4.1和4.2中,用于排序使用
let sortedArr = arr.sorted { (id1, id2) -> Bool in
return id1.fileId < id2.fileId // Use > for Descending order
}
斯威夫特3、4、5所示
struct imageFile {
var fileName = String()
var fileID = Int()
}
//append objects like this
var arrImages = [imageFile]()
arrImages.append(.init(fileName: "Hello1.png", fileID: 1))
arrImages.append(.init(fileName: "Hello3.png", fileID: 3))
arrImages.append(.init(fileName: "Hello2.png",fileID: 2))
//array sorting using below code
let sortImagesArr = arrImages.sorted(by: {$0.fileID < $1.fileID})
print(sortImagesArr)
//output
imageFile(fileName: "Hello1.png", fileID: 1),
imageFile(fileName: "Hello2.png", fileID: 2),
imageFile(fileName: "Hello3.png", fileID: 3)