概要
Swift でクロージャを返す関数を呼んだら、タイトルのとおりのエラーがでた
検索結果も英語ばっか
どーしよか
func createClosure() -> (Void) -> Void
{
print("UNKO")
return {() in print("OSHIKKO") }
}
override func viewDidLoad()
{
super.viewDidLoad()
self.createClosure() // コンパイルとおらん
// self.createClosure()() // こういう風にすぐ中身実行させるんならコンパイル通る
}
対応
とりあえずクロージャを変数につっこむことでエラーはなくなった
Objective-C なら、そんなんしなくても普通に通るのにね(´・ω・`)
「使用してない変数があるよ」レベルなら Warning ですむくせに・・・
override func viewDidLoad()
{
super.viewDidLoad()
let c: (Void) -> Void = self.createClosure() // コンパイルとおった
}
上の例でいうと、createClosure
の中の、UNKOだけを表示してOSHIKKOは表示しない
ということをしたい時、わざわざ (Void) -> Void
とか書くのがすごい面倒
他に方法はないのかな・・・
ということでもう少し探った
別解法
最も短い書き方はこういう感じか
override func viewDidLoad()
{
super.viewDidLoad()
_ = self.createClosure()
}
(;・`ω・´)。o(え アンスコって let とかなくても通るんだ・・・)
この書き方はよさげ
戻り値があることも、それはここで使わんよということもわかる
そして短い
でもこれだと型推論によるコンパイル遅延、みたいな問題が発生しそう
よく知らんが
Swift はその辺つらいらしいので、回避できるなら対処したい
なので型加えた上での短い文は・・・
override func viewDidLoad()
{
super.viewDidLoad()
let _:()->() = self.createClosure()
}
(´・ω・`)。o(クロージャの型の書き方色々ありすぎじゃね? Void->Void
とかもいけたんだけど)
うん やっぱめんどいね
もしかして #define
とかで左辺省略をできるかな と思ったけどやっぱダメ
結論
というかアンスコは「この先使用しないよ」を意味してるので
だったら型なんか書かなくてもコンパイル速度とか大丈夫なんじゃない?
とは思うのだけど・・・
今のところは、全部「_」で書いて、コンパイル遅いわ〜って思ったら、型つけなおすという方法を取ろうかなと
なんかわかったら追記しましょう
もっと楽な方法あったらおしえて(´・ω・`)