引数ラベルを省略する
Swift でメソッドを呼び出すとき、いつも思うのが引数ラベルの指定がめんどうなことです。アンダースコアを使うことで、それを省略することができます。簡単なメソッドならば、これで十分です。
下記のコードの前者が引数ラベルを省略しないときで、後者が省略するときです。
private func calc_divide(
answer want : inout Int32,
top value0: Int32,
btm value1: Int32
) ->Bool {
// check for ZeroDiv.
if ( value1 == 0 )
{
return false
}
want = value0 / value1
return true
}
private func calc_divide_without_var_label(
_ want : inout Int32,
_ value0: Int32,
_ value1: Int32
) ->Bool {
// check for ZeroDiv.
if ( value1 == 0 )
{
return false
}
want = value0 / value1
return true
}
具体的には下記のコードの25行目、31行目のようにコールします。
注目していただきたいのは26行目で、あえて引数ラベルと、変数名を同じに記述しました。引数ラベルのネーミングセンスが悪いと、こういう妙な状況になりがちだということを示しています。なぜこんな言語仕様にしたのか、私のような古い人間には理解不能です。オーバーロード対策なのでしょうかね?
import SwiftUI
struct ViewMain: View {
@State var v0: Int32 = 0
@State var v1: Int32 = 0
@State var answer:Int32 = 0
@State var answer_without_label: Int32 = 0
var body: some View {
VStack {
Text( String(format: "answer is %d", answer ) )
Text( String(format: "answer_without_label is %d", answer_without_label ) )
}
.padding()
.onAppear(){
v0 = 32
v1 = 2
let ret0 = calc_divide(
answer: &answer,
top: v0,
btm: v1
)
let ret1 = calc_divide_without_var_label(
&answer_without_label,
v0,
v1
)
if ( !ret0 ){
print( "calc_divide() is false")
}
if ( !ret1 ){
print( "calc_divide_without_label() is false")
}
}
}
private func calc_divide(
answer want : inout Int32,
top value0: Int32,
btm value1: Int32
) ->Bool {
// check for ZeroDiv.
if ( value1 == 0 )
{
return false
}
want = value0 / value1
return true
}
private func calc_divide_without_var_label(
_ want : inout Int32,
_ value0: Int32,
_ value1: Int32
) ->Bool {
// check for ZeroDiv.
if ( value1 == 0 )
{
return false
}
want = value0 / value1
return true
}
}
#Preview {
ViewMain()
}
ちなみに 25行目、31行目の戻り値は ret0 と ret1 で Bool 型を戻り値として受けておりますが、これを省略することもできます。
その場合もアンダースコアを使います。下記のようにします。戻り値の評価は重要なので、省略しないほうがいいと思いますけれど。
_ = calc_divide(
answer: &answer,
top: v0,
btm: v1
)
_ = calc_divide_without_var_label(
&answer_without_label,
v0,
v1
)