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
Post a Comment