节流

import Foundation

public class Throttler {
    private let queue: DispatchQueue = DispatchQueue.global(qos: .background)
    
    private var job: DispatchWorkItem = DispatchWorkItem(block: {})
    private var preiousRun: Date = Date.distantPast
    private var maxInterval: Int
    
    init(seconds: Int) {
        self.maxInterval = seconds
    }
    
    func throttle(block: @escaping ()->()) {
        job.cancel()
        job = DispatchWorkItem(){
            [weak self] in
            self?.preiousRun = Date()
            block()
        }
        let delay = Date.second(from: preiousRun) > maxInterval ? 0: maxInterval
        queue.asyncAfter(deadline: .now() + Double(delay), execute: job)
    }
}

private extension Date {
    static func second(from referenceDate: Date) -> Int {
        return Int(Date().timeIntervalSince(referenceDate).rounded())
    }
}

自定义操作符

// MARK: - 自定义操作符
public extension SafeArray {
 
    static func +=(left: inout SafeArray, right: Element) {
        left.append(right)
    }
 
    static func +=(left: inout SafeArray, right: [Element]) {
        left.append(right)
    }
}