Ah!, yes that would be perfect! Many thanks!
Regards, Rien Site: http://balancingrock.nl Blog: http://swiftrien.blogspot.com Github: http://github.com/Balancingrock Project: http://swiftfire.nl > On 09 Mar 2017, at 12:36, Ole Begemann <o...@oleb.net> wrote: > > On 09/03/2017 11:05, Rien via swift-users wrote: >> I am trying to achieve the following: >> >> enum FunctionResult<T> { >> case success(T) >> case error(String) >> } >> >> func tester<T>(test: (…) -> FunctionResult<T>, onError: (String) -> T) -> T { >> … >> } >> >> The problem is of course the (…) that simply does not work. >> >> I would like to use this generic with a variety of different signatures, >> i.e.: >> >> let result1 = tester(test: myfunc1(param: 26) -> FunctionResult<Bool>, >> onError: { … handle the error ... }) >> let result2 = tester(test: myfunc2(param: “A String") -> >> FunctionResult<Bool>, onError: { … handle the error ... }) >> let result3 = tester(test: myfunc3(param: 26, param2: “String") -> >> FunctionResult<Int>, onError: { … handle the error ... }) >> >> Is this at all possible? > > This should do it: > > func tester<T>(test: @autoclosure () -> FunctionResult<T>, > onError: (String) -> T) -> T { > switch test() { > case .success(let value): return value > case .error(let error): return onError(error) > } > } > > The insight is that you don't really want to pass a function in the first > parameter, but only the _result_ of that function call. The @autoclosure > attribute then makes sure that the expression you pass to tester is only > evaluated inside tester. You can leave it out if you want (if you do, replace > `switch test()` with `switch test`). _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users