Swiftでは関数やインスタンスメソッドにパラメータを渡す際、引数名を指定して呼び出すことが可能となっています。

引数が何を意味しているのか明示できるため、多数の引数をとる関数を使う際は便利な機能ですが、引数名を省略可能な場面、そうでない場面があり条件が複雑化しています。

ここではイニシャライザ、関数それぞれの場合に関して、外部引数名の指定方法、省略方法を解説します。

イニシャライザ

外部引数名を明示的に指定したイニシャライザ

「外部引数名 内部引数名: 型」という形式で引数を定義した場合、呼び出し側でもその外部引数名を使ってイニシャライザを呼び出す必要があります。

class Person {
    var name: String
    var age: Int
    init(withName name:String, andAge age: Int) {
        //外部引数名を明示的に指定したイニシャライザの定義
        self.name = name
        self.age = age
    }
    var description:  String {
        return "name=\(name) age=\(age)"
    }
}

//明示的に外部引数名を指定してイニシャライザを呼び出す
let person = Person(withName: "山田太郎", andAge: 12)
print(person.description)

外部引数名を省略したイニシャライザ

外部引数名として「_」アンダーバーを指定すると、呼び出し側で外部引数名を省略することができます。

class Person2 {
    var name: String
    var age: Int
    init(_ name: String, _ age: Int) {
        //外部引数名として"_"を指定したイニシャライザの定義
        self.name = name
        self.age = age
    }
    
    var description:  String {
        return "name=\(name) age=\(age)"
    }
}

//外部引数名を省略してイニシャライザを呼び出す
let person2 = Person2("山田二郎", 11)
print(person2.description)

内部引数名を外部引数名としたイニシャライザ

外部引数名を指定せず、他のプログラミング言語のように「内部引数名: 型」を引数に指定したした場合、その内部引数名を指定してイニシャライザを呼び出す必要があります。

class Person3 {
    var name: String
    var age: Int
    init(name: String, age: Int) {
        //外部引数名を省略すると内部引数名の指定が必要となる
        self.name = name
        self.age = age
    }
    
    var description:  String {
        return "name=\(name) age=\(age)"
    }
}

//内部引数名を外部引数名として指定してイニシャライザを呼び出す
let person3 = Person3(name: "山田三郎", age: 10)
print(person2.description)

関数

外部引数名を明示的に指定した関数

外部引数名を明示した場合、呼び出し側でもその外部引数名を指定して関数を呼び出す必要があります。

func hello(withMessage message: String, withNumber num: Int) {
    // 外部引数名をフルに指定した関数の定義
    print(message)
    print(num)
}

// 外部引数名を全て指定して関数を呼び出す
hello(withMessage: "こんにちは", withNumber: 10)

外部引数名を省略した関数

関数の場合第1引数は明示的に外部引数名を指定しない限り、呼び出し時の指定が省略されます。第2引数以降は「_」アンダーバーを指定すると、呼び出し側で外部引数名を省略することができます。

func hello(message: String, _ num: Int) {
    // 外部引数名を省略した関数定義
    print(message)
    print(num)
}

// 外部引数名を全て指定して関数を呼び出す
hello("こんにちは", 10)

内部引数名を外部引数名とした関数

「内部引数名: 型」を引数に指定したした場合、呼び出し側で第1引数は省略する必要がありますが、第2引数以降は内部引数名を指定して呼び出す必要があります。

func hello2(message: String, num: Int) {
    //外部引数名を省略すると内部引数名の指定が必要となる
    print(message)
}


//内部引数名を外部引数名として指定して関数を呼び出す。この場合最初の引数名は省略する必要がある。
hello2("こんにちは", num: 10)

まとめ

Swiftの引数の省略・指定の方法はObjective-Cとの相互運用を想定してか、かなり面倒なものとなっています。今回の説明はSwift 2.2をしていますが、Swiftのバージョンアップによって変更される可能性もあります。