1.

Swift「error: missing argument label」原因と対処|引数ラベルの仕様

編集
この記事の要点
  • Swift の error: missing argument label '...:' in call
  • 原因: 関数を呼ぶときに引数ラベルを省略している
  • Swift では関数定義で書いたラベルを呼び出し時にも明示するのが基本
  • 省略したい場合は定義側で _ name: Type のようにアンダースコアを付ける
  • 外部名と内部名を分けたい場合は external internal: Type の書式

エラー内容

error: missing argument label 'name:' in call
let user = User("Alice", 25)
                ^
                name:

error: missing argument label 'count:' in call
showItems(10)
          ^
          count:

原因

Swift は引数ラベル(argument label)を呼び出し側で明示することを要求します。これは「自然な英語のような読みやすさ」を実現する仕様で、Objective-C の文化を引き継いだ Swift の特徴です。

// 関数定義
func showItems(count: Int) {
    print("count: \(count)")
}

// ❌ NG: ラベル無しで呼ぶ
showItems(10)
// error: missing argument label 'count:' in call

// ✅ OK: ラベル付きで呼ぶ
showItems(count: 10)

対処1: 呼び出し時にラベルを付ける

関数定義は変えず、呼び出し側でラベルを明記:

struct User {
    let name: String
    let age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

// ✅ ラベル明記で呼ぶ
let alice = User(name: "Alice", age: 25)

// 関数も同様
func greet(person: String, message: String) {
    print("\(message), \(person)!")
}

greet(person: "Alice", message: "Hello")

対処2: 定義側でラベルを省略可能に

呼び出し側でラベルを書きたくない場合、関数定義で アンダースコア _ を付けると省略可能になります:

// 定義側で _ を付ける
func showItems(_ count: Int) {
    print("count: \(count)")
}

// ラベル無しで呼べる
showItems(10)

// イニシャライザも同様
struct User {
    let name: String
    init(_ name: String) {
        self.name = name
    }
}

let bob = User("Bob")  // ラベル不要

外部ラベル と 内部パラメータ名

Swift は引数に「外部名(呼び出し時の名前)」と「内部名(関数本体内で使う名前)」を分けて指定できます:

// 構文: func name(外部ラベル 内部パラメータ名: 型)
func greet(to person: String, with message: String) {
    print("\(message) to \(person)")
    //         ↑ ここでは person, message を使う(内部名)
}

// 呼び出し側は外部ラベルを使う
greet(to: "Alice", with: "Hello")

// 自然な英語っぽく読める
// "greet to Alice with Hello"

// 外部ラベルだけ無くす
func greet(_ person: String, message: String) {
    // person は内部でも外部でも同名
}
greet("Alice", message: "Hello")

典型的な使い分け

シーン定義呼び出し
1 引数で自明func print(_ value: Any)print("foo")
意味を明示したいfunc setAge(to age: Int)setAge(to: 30)
イニシャライザinit(name: String, age: Int)User(name: "A", age: 1)
動詞 + 補語func add(_ item: Item, to list: [Item])add(item, to: list)

標準ライブラリの実例

// Array の append(_:contentsOf:) - 第 1 引数は省略、第 2 引数は明示
var arr = [1, 2, 3]
arr.append(4)                              // _: で省略可
arr.append(contentsOf: [5, 6])             // contentsOf: で明示

// String の hasPrefix(_:) - 第 1 引数省略
"hello".hasPrefix("he")

// String の replacingOccurrences(of:with:)
"hello world".replacingOccurrences(of: "world", with: "Swift")

// Dictionary の subscript
let dict = ["a": 1, "b": 2]
let v = dict["a"]                          // ラベルなし添字

関数オーバーロード でラベルが活きる

Swift は引数ラベルが違えば同名関数を複数定義できます:

func search(name: String) -> User? { ... }
func search(email: String) -> User? { ... }
func search(id: Int) -> User? { ... }

// 呼び出し側でどれを呼ぶか明示的
let u1 = search(name: "Alice")
let u2 = search(email: "alice@example.com")
let u3 = search(id: 42)

クロージャでも同じ

// 関数型は呼び出し時にラベル不要
let action: (String, Int) -> Void = { name, age in
    print("\(name), \(age)")
}
action("Alice", 25)  // ラベル無し

// クロージャを引数に取る関数
func process(callback: (String) -> Void) {
    callback("Hello")
}

process(callback: { msg in
    print(msg)
})

// trailing closure(末尾クロージャ)構文
process { msg in
    print(msg)
}

関連エラー

  • "extraneous argument label 'xxx:' in call": 不要なラベルを付けた逆のケース
  • "argument 'xxx' must precede argument 'yyy'": 引数順序違反
  • "cannot find 'xxx' in scope": 関数名 / 変数名のスコープ違い
  • "missing argument for parameter 'xxx' in call": 必須引数の省略

Swift Style Guide のベストプラクティス

  1. 第 1 引数で文脈が明確なら _ で省略(append, print 等)
  2. 第 2 引数以降は意味を明示するラベルを使う
  3. 動詞 + 前置詞の構造で自然に読めるラベルを選ぶ(add(_:to:), move(from:to:)
  4. イニシャライザはプロパティ名と同じラベルがデフォルト
  5. 「ラベル省略 vs ラベル必須」の判断は呼び出し側の読みやすさを最優先
編集
Post Share
子ページ

子ページはありません

同階層のページ

同階層のページはありません