xcode - Workaround/resolution for Swift compiler error related to Void callback defined in struct -


due lack of generic support in typealias definitions in swift, wrote generic resulthandler<t> callback so:

struct resulthandler<t> {     let f: (result: t) -> () } 

this works great handlers use other void:

dispatch<bool>.dispatch({ () -> (result<bool>) in     result<bool>(true) }).onresult(resulthandler() { (result: bool) in     if result {         self.dosomething() // method executes     } }) 

but when attempting use void:

dispatch<void>.dispatch({ () -> (result<void>) in     result<void>() }).onresult(resulthandler() { (result: void) in // compiler error here     self.dosomething() }) 

there compilation error:

function signature '(void) -> ()' not compatible expected type '(result: void) -> ()'

which seems misleading/a compiler bug, if change signature use wrongly-typed value:

dispatch<void>.dispatch({ () -> (result<void>) in     result<void>() }).onresult(resulthandler() { (result: void?) in // compiler error here     self.dosomething() }) 

the error message picks optional-indicating ?, still not detect result: label:

function signature '(void?) -> ()' not compatible expected type '(result: void) -> ()'

what doing wrong?

you don't need specify parameter names in closure type declarations—that's what's giving compiler problems:

struct resulthandler<t> {     let f: t -> () } 

now can create resulthandler instances use bool parameter, void parameter, or leave out parameter altogether:

let r1 = resulthandler() { (result: bool) in     if result {         //     } }  let r2 = resulthandler() { (_: void) in     // }  let r3 = resulthandler() {     // } 

Comments

Popular posts from this blog

angularjs - ADAL JS Angular- WebAPI add a new role claim to the token -

php - CakePHP HttpSockets send array of paramms -

node.js - Using Node without global install -