Optional chaining in Swift Closure where return type has to be Void
Solution 1:
Optional chaining wraps whatever the result of the right side is inside an optional. So if run()
returned T
, then x?.run()
returns T?
. Since run()
returns Void
(a.k.a. ()
), that means the whole optional chaining expression has type Void?
(or ()?
).
When a closure has only one line, the contents of that line is implicitly returned. So if you only have that one line, it is as if you wrote return weakSelf.rscript?.run()
. So you are returning type Void?
, but dispatch_async
needs a function that returns Void
. So they don't match.
One solution is to add another line that explicitly returns nothing:
dispatch_after(time, dispatch_get_main_queue()) {
weakSelf.rscript?.run()
return
}