Swift how to sort array of custom objects by property value

前端 未结 18 2456
逝去的感伤
逝去的感伤 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: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.

提交回复
热议问题