引数ラベルを省略する

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
                    )