Swift how to sort array of custom objects by property value

前端 未结 18 2068
逝去的感伤
逝去的感伤 2020-11-22 02:12

lets say we have a custom class named imageFile and this class contains two properties.

class imageFile  {
    var fileName = String()
    var fileID = Int(         


        
相关标签:
18条回答
  • 2020-11-22 02:50

    First, declare your Array as a typed array so that you can call methods when you iterate:

    var images : [imageFile] = []
    

    Then you can simply do:

    Swift 2

    images.sorted({ $0.fileID > $1.fileID })
    

    Swift 3+

    images.sorted(by: { $0.fileID > $1.fileID })
    

    The example above gives desc sort order

    0 讨论(0)
  • 2020-11-22 02:50

    Swift 4.0, 4.1 & 4.2 First, I created mutable array of type imageFile() as shown below

    var arr = [imageFile]()
    

    Create mutable object image of type imageFile() and assign value to properties as shown below

       var image = imageFile()
       image.fileId = 14
       image.fileName = "A"
    

    Now, append this object to array arr

        arr.append(image)
    

    Now, assign the different properties to same mutable object i.e image

       image = imageFile()
       image.fileId = 13
       image.fileName = "B"
    

    Now, again append image object to array arr

        arr.append(image)
    

    Now, we will apply Ascending order on fileId property in array arr objects. Use < symbol for Ascending order

     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
    

    Now, we will apply Descending order on on fileId property in array arr objects. Use > symbol for Descending order

     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
    

    In Swift 4.1. & 4.2 For sorted order use

    let sortedArr = arr.sorted { (id1, id2) -> Bool in
      return id1.fileId < id2.fileId // Use > for Descending order
    }
    
    0 讨论(0)
  • 2020-11-22 02:52

    You can also do something like

    images = sorted(images) {$0.fileID > $1.fileID}
    

    so your images array will be stored as sorted

    0 讨论(0)
  • 2020-11-22 02:52

    If you are not using custom objects, but value types instead that implements Comparable protocol (Int, String etc..) you can simply do this:

    myArray.sort(>) //sort descending order
    

    An example:

    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
    
    0 讨论(0)
  • 2020-11-22 02:54

    Swift 2 through 4

    The original answer sought to sort an array of custom objects using some property. Below I will show you a few handy ways to do this same behavior w/ swift data structures!

    Little things outta the way, I changed ImageFile ever so slightly. With that in mind, I create an array with three image files. Notice that metadata is an optional value, passing in nil as a parameter is expected.

     struct ImageFile {
          var name: String
          var metadata: String?
          var size: Int
        }
    
        var images: [ImageFile] = [ImageFile(name: "HelloWorld", metadata: nil, size: 256), ImageFile(name: "Traveling Salesmen", metadata: "uh this is huge", size: 1024), ImageFile(name: "Slack", metadata: "what's in this stuff?", size: 2048) ]
    

    ImageFile has a property named size. For the following examples I will show you how to use sort operations w/ properties like size.

    smallest to biggest size (<)

        let sizeSmallestSorted = images.sorted { (initial, next) -> Bool in
          return initial.size < next.size
        }
    

    biggest to smallest (>)

        let sizeBiggestSorted = images.sorted { (initial, next) -> Bool in
          return initial.size > next.size
        }
    

    Next we'll sort using the String property name. In the same manner, use sort to compare strings. But notice the inner block returns a comparison result. This result will define sort.

    A-Z (.orderedAscending)

        let nameAscendingSorted = images.sorted { (initial, next) -> Bool in
          return initial.name.compare(next.name) == .orderedAscending
        }
    

    Z-A (.orderedDescending)

        let nameDescendingSorted = images.sorted { (initial, next) -> Bool in
          return initial.name.compare(next.name) == .orderedDescending
        }
    

    Next is my favorite way to sort, in many cases one will have optional properties. Now don't worry, we're going to sort in the same manner as above except we have to handle nil! In production;

    I used this code to force all instances in my array with nil property values to be last. Then order metadata using the assumed unwrapped values.

        let metadataFirst = images.sorted { (initial, next) -> Bool in
          guard initial.metadata != nil else { return true }
          guard next.metadata != nil else { return true }
          return initial.metadata!.compare(next.metadata!) == .orderedAscending
        }
    

    It is possible to have a secondary sort for optionals. For example; one could show images with metadata and ordered by size.

    0 讨论(0)
  • 2020-11-22 02:58

    Swift 3

    people = people.sorted(by: { $0.email > $1.email })
    
    0 讨论(0)
提交回复
热议问题