LoginSignup
4
3

More than 5 years have passed since last update.

「Expression resolves to an unused function」を回避したい

Posted at

概要

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 とかで左辺省略をできるかな と思ったけどやっぱダメ

結論

というかアンスコは「この先使用しないよ」を意味してるので
だったら型なんか書かなくてもコンパイル速度とか大丈夫なんじゃない?
とは思うのだけど・・・

今のところは、全部「_」で書いて、コンパイル遅いわ〜って思ったら、型つけなおすという方法を取ろうかなと
なんかわかったら追記しましょう

もっと楽な方法あったらおしえて(´・ω・`)

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3