I haven\'t used Swift that much but coming from Objective C, there\'s a few things about Swift that\'s a PITA to get my head around.
In iOS programming, we have
From "Calling Methods Through Optional Chaining":
Any attempt to set a property through optional chaining returns a value of type
Void?
, which enables you to compare against nil to see if the property was set successfully ...
Therefore the type of the expression
self.customView?.transform = CGAffineTransformMakeTranslation(0.0, 0.0)
is Void?
(optional Void). And if a closure consists only of a single expression,
then this expression is automatically taken as the return value.
The error message is quite misleading, but it comes from the fact that Void?
is
different from Void
.
Adding an explicit return
statement solves the problem:
UIView.animateWithDuration(0.5, animations: { () -> Void in
self.customView?.transform = CGAffineTransformMakeTranslation(0.0, 0.0)
return
})
Update: Adding an explicit return
statement it not necessary
anymore with Swift 1.2 (Xcode 6.3). From the beta release notes:
Unannotated single-expression closures with non-Void return types can now be used in Void contexts.