
Всем привет!
На интервью иногда просят реализовать одну из функций высшего порядка. Решил потренироваться в их самостоятельной реализации. Ниже представлен результат моих тренировок =)
Иногда бывает легче реализовать функцию конкретного типа, а затем сделать её универсальной (Generic). Такого подхода я и буду придерживаться в примерах, приведенных ниже.
Все функции написаны в расширении массива ( extension Array)
Reduce
extension Array { func customIntReduce(res: Int, handler:(Int, Int) -> Int) -> Int { var result = res for elem in self { result = handler(result, elem as! Int) } return result } func customReduce<T, U>(res: T, handler:(T, U) -> T) -> T { var result = res for elem in self { result = handler(result, elem as! U) } return result } } print([1, 2, 3].customIntReduce(res: 0) { $0 + $1 }) print([1, 2, 3].customReduce(res: 0) { $0 + $1 })
Filter
func customIntFilter(handler: (Int) -> Bool) -> [Int] { var filteredArray: [Int] = [] for element in self { if handler(element as! Int) { filteredArray.append(element as! Int) } } return filteredArray } func customFilter(handler: (Element) -> Bool) -> [Element] { var filteredArray: [Element] = [] for element in self { if handler(element) { filteredArray.append(element) } } return filteredArray } print([1, 2, 3, 4, 5].customIntFilter{ $0 > 2}) print([1, 2, 3, 4, 5].customFilter{ $0 > 2})
Map
func customIntMap(handler: (Int) -> Any) -> [Any] { var mapedArray:[Any] = [] for elem in self { let mapedValue = handler(elem as! Int) mapedArray.append(mapedValue) } return mapedArray } func customMap<T>(handler: (Element) -> T) -> [T] { var mapedArray: [T] = [] for elem in self { let mapedValue = handler(elem) mapedArray.append(mapedValue) } return mapedArray } print([1, 2, 3].customIntMap{ "\($0 * $0)" }) print([1, 2, 3].customMap{ "\($0 * $0)" })
Compact Map
func customStringCompactMap(_ handler: (String) -> Any?) -> [Any] { var mapedArray: [Any] = [] for elem in self { if let mapedValue = handler(elem as! String) { mapedArray.append(mapedValue) } } return mapedArray } func customCompactMap<T>(handler: (Element) -> T?) -> [T] { var mapedArray: [T] = [] for elem in self { if let mapedValue = handler(elem) { mapedArray.append(mapedValue) } } return mapedArray } print(["1", "two", "3"].customStringCompactMap{ Int($0) }) print(["1", "two", "3"].customCompactMap{ Int($0) })
Flat Map
func customIntFlatMap(handler: ([Int]) -> Any) -> [Any] { var mappedArray: [Any] = [] forEach { mappedArray += handler($0 as! [Int]) as! Array<Any> } return mappedArray } func customFlatMap<T>(handler: (Element) -> [T]) -> [T] { var mappedArray: [T] = [] forEach { mappedArray += handler($0) } return mappedArray } let arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] let mapped = arr.customIntFlatMap{ $0 } print(mapped) let mapped2 = arr.customFlatMap{ $0 } print(mapped2)
Надеюсь примеры помогут кому-то лучше подготовиться к собеседованию, а кому-то лучше разобраться в дженериках.
