(discord/swift/2018/03/16/0) 関数の返り値の型としてvoidコンテキストの挙動について

概要

  • discord ios dev
    • #swift
    • 2018/03/16
  • 関数の返り値の型としてvoidコンテキストの挙動について

log

rintaro - 2018/03/16

を見て

func foo() -> Int { print("Int"); return 1 }
func foo() { print("Void") }

foo() // error: ambiguous use of 'foo()'

omochimetaru - 2018/03/16

返り値オーバーロード

なるほど・・・w


rintaro - 2018/03/16

Void のコンテキストなら下ので確定できたら便利なのかな?


t.ae - 2018/03/16

func foo() -> Int { print("Int"); return 1 }
func foo() { print("Void") }

foo() // error: ambiguous use of 'foo()'
_ = foo() // error: ambiguous use of 'foo()'
() = foo() // Void

最後の記法がちょっとおもしろい


rintaro - 2018/03/16

ほほー


omochimetaru - 2018/03/16

_ = foo() なら Void 優先してほしいね。 いや?それもへんか。 捨ててるんだからなんかあるのか。


t.ae - 2018/03/16

それは返り値握りつぶしてる感あるのでむしろIntが呼ばれてそうにみえますね


omochimetaru - 2018/03/16

そうですねえ・・・


koher - 2018/03/16

() = ... とかできるのか。 foo() は void と解釈してほしいかも。

@discardableResult との兼ね合いをよく考えないといけなさそうだ。

@discardableResult func foo() -> Int { print("Int"); return 1 }
func foo() { print("Void") }

foo() // どっちになってほしい?

t.ae - 2018/03/16

fooだから分かりにくいですけどガイドラインに従ってればappendとappendingとかみたいになるんであんまり問題起こらない気がしますね。

mutating funcの場合に限るかそれは。


koher - 2018/03/16

今はそもそもがオーバーロードしたときに見分けてくれた方がいいかという前提の話なのでは?


t.ae - 2018/03/16

うんまぁそうですが


koher - 2018/03/16

実際には問題になるケースが少ないから

ambiguous でいいんじゃないかってことか。


t.ae - 2018/03/16

処理内容が同様ならdiscardableResultだけでいいし、処理内容が異なるならオーバーロードするのが間違っている気がします


Kishikawa Katsumi - 2018/03/16

コンパイルエラーで全然いいんだけどエラーメッセージをわかりやすくしてほしいと思っています。


rintaro - 2018/03/16

たぶん元コンテキストのモチベーションとしては、

@discardableResult func foo() -> Int { print("Int"); return 1 }

が既にありそれを使っているプロジェクトなんだけど、返値の生成にそれなりの負荷があるので、

func foo() でオーバーロード出来れば、軽量化出来る可能性があると。


omochimetaru - 2018/03/16

あと元コンテキストはRubyですね。


Kishikawa Katsumi - 2018/03/16

戻り値の型によるオーバーロードを使ったAPIを提供しているSDKをメンテしていた経験でいうと。


t.ae - 2018/03/16

返値の生成にそれなりの負荷がある

そういうケースはありますね……


rintaro - 2018/03/16

はい、Ruby はとりあえず無視でw


omochimetaru - 2018/03/16

Swiftだったら別に普通に呼び出してる箇所全部リファクタリングできるから別名でオーバーロードで解決しそう・・・


Kishikawa Katsumi - 2018/03/16

書き換えが許されるならオーバーロードを作って呼び出し元で戻り値の型を区別するのでもSwiftなら一緒じゃないですか?

別名をつけなくても。

どっちがわかりやすいとかは別として。


omochimetaru - 2018/03/16

あー、それはそうですね。


tarunon - 2018/03/16

discardableResult外してVoid overloadでいいじゃん、みたいな気がした

あ、だめなのか