You can use .lazy to slightly improve performance:
let numbers: [Int] = Array(0 ..< 2000) let result: AnySequence = numbers .lazy .filter { print("Calling filter for: \($0)") return ($0 % 3) == 0 } .prefix(5) print(Array(result))
This will call the filter function only for the first 15 values ββ(until it finds 5 that pass the filter).
Now you can focus on improving the performance of the filter itself. For example. by caching values. You do not have to do this, but if some values ββare repeated, this can significantly improve performance.
let numbers: [Int] = Array(0 ..< 2000) var filterCache: [Int: Bool] = [:] let result: AnySequence = numbers .lazy .filter { if let cachedResult = filterCache[$0] { return cachedResult } print("Calling filter for: \($0)") let result = (($0 % 3) == 0) filterCache[$0] = result return result } .prefix(5) print(Array(result))
You can apply this method directly to your function.
Also note that to improve performance you should:
let result: AnySequence = providerArray .lazy .filter { $0.range(of: row.value as! String, options: [.caseInsensitive]) != nil } .prefix(5)
Sulthan
source share