1. ホーム
  2. ios

Swift : コール中の引数ラベル 'xxx' の欠落

2023-09-01 14:26:18

質問

func say(name:String, msg:String) {
    println("\(name) say \(msg)")
}

say("Henry","Hi,Swift")  <---- error because missing argument label 'msg' in call

を使う必要があります。

   say("Henry",msg:"Hi,Swift")

なぜですか?もし、funcに2つ以上のvarを入れて、このfuncを呼び出すときに、最初のvarの代わりにvar名を書く必要があるのでしょうか?

iBook Swiftのチュートリアルにも説明がありません。

どのように解決するのですか?

考えられる理由の1つは、それが実際にはメソッドであるということです。 メソッドは非常に卑劣で、普通の関数と同じように見えますが、同じようには動作しません。これを見てみましょう。

func funFunction(someArg: Int, someOtherArg: Int) {
    println("funFunction: \(someArg) : \(someOtherArg)")
}

// No external parameter
funFunction(1, 4)

func externalParamFunction(externalOne internalOne: Int, externalTwo internalTwo: Int) {
    println("externalParamFunction: \(internalOne) : \(internalTwo)")
}

// Requires external parameters
externalParamFunction(externalOne: 1, externalTwo: 4)

func externalInternalShared(#paramOne: Int, #paramTwo: Int) {
    println("externalInternalShared: \(paramOne) : \(paramTwo)")
}

// The '#' basically says, you want your internal and external names to be the same

// Note that there's been an update in Swift 2 and the above function would have to be written as:

func externalInternalShared(paramOne paramOne: Int, #paramTwo: Int) {
    print("externalInternalShared: \(paramOne) : \(paramTwo)")
}

externalInternalShared(paramOne: 1, paramTwo: 4)

さて、ここからが面白いところですが、クラスの中で関数を宣言すると、それはもはや関数ではありません...それはメソッドです。

class SomeClass {
    func someClassFunctionWithParamOne(paramOne: Int, paramTwo: Int) {
        println("someClassFunction: \(paramOne) : \(paramTwo)")
    }
}

var someInstance = SomeClass()
someInstance.someClassFunctionWithParamOne(1, paramTwo: 4)

これはメソッドの動作設計の一部である

Apple Docs

具体的には、Swift はデフォルトでメソッドの最初のパラメーター名にローカルパラメーター名を与え、2番目以降のパラメーター名にはデフォルトでローカルと外部パラメーターの両方の名前を与えます。この規約は、Objective-C のメソッドを書くことから馴染みのある典型的な名前付けと呼び出しの規約に一致し、パラメータ名を修飾する必要なく、表現力豊かなメソッド呼び出しを可能にします。

オートコンプリートに注目してください。