How to sort an array of custom objects by property value in Swift
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 the results in descending order.
How do I sort an array of an array in Swift 5
You can do in following way:
a.sort {
return $0.last as! Int > $1.last as! Int
}
Don't forget to add additional checks while using this code, case where the last item is not an integer or there is an array not in the expected format. Otherwise, it will lead to a crash.
Sort an array A in Swift based on (1) an incomplete array B and (2) alphabetically
Based on this answer mentioned by Alexander I ended up with the following solution:
tags.sort {
(idOrdering.firstIndex(of: $0.id) ?? idOrdering.count, $0.name) <
(idOrdering.firstIndex(of: $1.id) ?? idOrdering.count, $1.name)
}
Sort array based on the order from another array Swift
You can try the following in Swift. Note the dictionaries in Swift are unordered so you have to use arrays for ordered collections:
let fetchedProducts = [
(name: "productName20", id: 20),
(name: "productName3", id: 3),
(name: "productName1", id: 1),
]
let sortedProducts = [
("productName1", "1"),
("productName20", "20"),
("productName3", "3"),
]
let sortedFetchedProducts = sortedProducts
.compactMap { s in
fetchedProducts.first(where: { s.1 == String($0.id) })
}
print(sortedFetchedProducts)
// [(name: "productName1", id: 1), (name: "productName20", id: 20), (name: "productName3", id: 3)]
Swift sorting nest String Array by Numbered Array Sort
You can get an index from one array and sort using values from the second array:
let a = [["ddd"],["aaa"],["ggg"]]
let b = [557, 147, 355]
let sortedA = a.sorted { b[a.firstIndex(of: $0)!] < b[a.firstIndex(of: $1)!] }
// prints [["aaa"], ["ggg"], ["ddd"]]
let sortedB = b.sorted()
// prints [147, 355, 557]
This one-liner:
let sortedA = a.sorted { b[a.firstIndex(of: $0)!] < b[a.firstIndex(of: $1)!] }
is a shorter form of this:
let sortedA = a.sorted { item1, item2 in
let item1Index = a.firstIndex(of: item1)!
let item2Index = a.firstIndex(of: item2)!
return b[item1Index] < b[item2Index]
}
Swift sorted(by:) method doesn't correctly sort an array of struct based on integer
The predicate to Array.sorted(by:) requires that you
return true if its first argument should be ordered before its second argument; otherwise, false.
The order of the arguments passed to the predicate can be given in either order ((a, b)
or (b, a)
) depending on how the list has been sorted so far, but the predicate must give a consistent result in either order or else you'll get nonsense results.
In your predicate, you're checking the first element's user ID to prioritize it, but not the second; i.e., you're handling (a, b)
but not (b, a)
. If you update your predicate to
myArray.sorted(by: {
// The order of the checking here matters. Specifically, the predicate
// requires a `<` relationship, not a `<=` relationship. If both $0 and $1
// have the same `user_id`, we need to return `false`. Checking $1.user_id
// first hits two birds with one stone.
if $1.user_id == 40 {
return false
} else if $0.user_id == 40 {
return true
}
return $0.user_id < $1.user_id
})
then you'll get consistent results.
Alternatively, if the element is known ahead of time, you can avoid this by extracting it from the list and sorting the remaining results.
Sort array ascending with zero at the end in Swift
Replace any 0
encountered with a large number like Int.max
in the areInIncreasingOrder
predicate parameter for sorted:
let score = [3, 0, 4, 6]
let ranking = score.sorted{ ($0 == 0 ? Int.max : $0) < ($1 == 0 ? Int.max : $1) }
print(ranking)
Output:
[3, 4, 6, 0]
Related Topics
Xcode 8.3 Can't Support Swift 2.3
Inconsistent Scenekit Framerate
Ios8 Custom Keyboard - Copy & Paste to Uipasteboard
Difference Between String Interpolation and String Initializer in Swift
In Swift, What Does It Mean for Protocol to Inherit from Class Keyword
App Delegate Accessing Environment Object
Using Stringbyreplacingcharactersinrange in Swift
Difference Between Associated and Raw Values in Swift Enumerations
How to Execute Code Once and Only Once in Swift
What Determines Whether a Swift 5.5 Task Initializer Runs on the Main Thread
Listing All Files in a Folder Recursively with Swift
Value of Optional Type Cgfloat Not Unwrapped Error in Swift
Optional Field Type Doesn't Conform Protocol in Swift 3
How to Change Navigation Bar & Back Button Colour iOS 15
Apple's Description of Reference and Value Types with Multiple Threads
Trying to Stream Audio from Microphone to Another Phone via Multipeer Connectivity