Extending Array to check if it is sorted in Swift?

前端 未结 11 2442
清歌不尽
清歌不尽 2020-12-13 14:23

I want to extend Array class so that it can know whether it is sorted (ascending) or not. I want to add a computed property called isSorted. How can I state the

11条回答
  •  借酒劲吻你
    2020-12-13 15:07

    Here is a solution in Swift 4 that won't crash when self.count is equal or less than 1:

    extension Array where Element: Comparable {
        func isSorted(by isOrderedBefore: (Element, Element) -> Bool) -> Bool {
            for i in stride(from: 1, to: self.count, by: 1) {
                if !isOrderedBefore(self[i-1], self[i]) {
                    return false
                }
            }
            return true
        }
    }
    

    This snippet supposes that an array of 1 or 0 elements is already sorted.

    The reason to start with 1 in the for-loop range is: In case self.count <= 1, the loop will be skipped, a small performance increase. Using stride instead of ..< avoids the crash when the upper bound is < than the lower bound of a range.

    Here are some examples:

    [1, 2, 3].isSorted(by: >) // true
    [3, 2, 2].isSorted(by: >=) // true
    [1, 4, 7].isSorted(by: {x, y in
        return x + 2 < y * y
    }) // true
    
    let a: [Int] = [1]
    a.isSorted(by: <) // true
    
    
    let b: [Int] = []
    b.isSorted(by: >) // true
    

提交回复
热议问题