Недавно я столкнулся с необходимостью создания массива функций. К сожалению, язык Swift не предоставляет тип верхнего уровня для функций, но вместо этого они должны быть объявлены своей конкретной подписью (...)->(...)
. Поэтому я попытался написать оболочку, которая может содержать любую функцию, а затем специализировать ее для хранения только замыканий, имеющих Void
возвращаемый тип и любое количество аргументов.
struct AnyFunction {
let function: Any
init?(_ object: Any){
switch String(describing: object){
case let function where function == "(Function)":
self.function = object
default:
return nil
}
}
func callAsFunction(){
self.function()
}
}
Когда я прогрессировал, я обнаружил, что это не тривиально и, возможно, требует некоторых хаков с самоанализом, но мне не удалось найти решение, несмотря на мои попытки. Сообщение от компилятора:
error: cannot call value of non-function type 'Any'
Итак, как бы вы сделали этот трюк, чтобы уточнить, чтобы определить объект, который может содержать любой функциональный тип?
Уточнение: что я бы предпочел, этоопределяя что-то вроде:
typealias SelfSufficientClosure = (...)->Void
var a, b, c = 0
let funcs = FunctionSequence
.init(with: {print("Hi!")}, {a in a + 3}, {b in b + 3}, { a,b in c = a + b})
for f in funcs { f() }
print([a, b, c])
//outputs
//"Hi"
//3, 3, 6
PS Этот вопрос имеет отношение к этому ( Любой или проблема с последовательностью функций )