Стандартная функция reduce
использует дженерики. См. Главу Generics в книге Swift.
func reduce<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
Имеет два общих типа: Result
и Element
. Element
исходит от типа значений в коллекции, а Result
- от типа результата уменьшенного значения.
Итак, ваш первый шаг - использовать идентичную подпись в вашей собственной функции perform
.
Но при этом вы обнаружите, что теперь вам нужно сделать свой класс MyArray
также основанным на универсальном, а не жестко закодированном для работы только с Int
.
И, пытаясь сделать это, вы обнаружите, что вы не можете определить MyArray
как универсальный и одновременно поддерживать шаблон синглтона. Таким образом, вам нужно удалить instance
и getIntance()
.
Конечный результат становится:
public class MyArray<Element> {
private var arr: [Element] = []
public init() {}
public func insert(value val: Element) {
arr.append(val)
}
/*************** Custom reduce like function ***************/
public func perform<Result>(_ initialResult: Result, _ nextPartialResult: (Result, Element) -> Result) -> Result {
var result = initialResult
for element in arr {
result = nextPartialResult(result, element)
}
return result
}
}
С этим, ваш первый пример становится:
var arr1 = MyArray<Int>()
arr1.insert(value: 1)
arr1.insert(value: 2)
arr1.insert(value: 4)
arr1.insert(value: 3)
arr1.insert(value: 2)
arr1.insert(value: 5)
arr1.insert(value: 2)
arr1.insert(value: 2)
// :Complex calculations left for user to implement
var result = arr1.perform(0) {
return $0 + ( $1 * $1)
}
print(result)
И это выводит желаемый результат 67
.
В конце концов, это работает, но если вы заметите, нет никакого смысла в этом MyArray
классе (кроме учебного упражнения). Просто используйте Array
.