問題
Weakキャプチャリストを記述して循環参照を回避しようとしました。
self
はOptional扱いになるので、クロージャの式でself
をOptional Chainingにするとエラーになりました。
↓
Cannot invoke 'animateWithDuration' with an argument list of type '(NSTimeInterval, delay: FloatLiteralConvertible, options: UIViewAnimationOptions, animations: () -> () -> $T4, completion: (finished: Bool) -> ())'
原因
クロージャは式が1行の場合その式の結果を戻り値として返します。
layoutIfNeededの戻り値はVoidですがself
がnilの場合self?
はnilを返します。
animationsクロージャ型の戻り値はVoidですが、式がnilを返却する可能性があるためエラーになっているようです。
解決方法
self
をOptional Bindingにするとコンパイルが通りました。
Optional Chainingで左辺に代入するとコンパイルワーニングが出ますがコンパイルは通りました。
最後にreturn
を記述するとコンパイルが通りました。
追記
@mono0926 さんより以下ご指摘頂きました。
ありがとうございます。
式が1つの場合、その式の評価結果が戻り値になってしまうんですよね。
なので、self?.view.layoutIfNeeded()の前に何か他の処理が書かれている場合もコンパイルが通ると思います。