func say(name:String, msg:String) {
println("\(name) say \(msg)")
}
say("Henry","Hi,Swift") // error: missing argument label 'msg' in call
使用する必要がある
say("Henry",msg:"Hi,Swift")
なぜでしょうか? 関数のパラメータ リストに 2 つ以上の変数を配置する場合、この関数を呼び出すときに、変数だけではなく変数名も記述する必要があります。
本当に面倒です。iBook Swift チュートリアルには説明がありません。
ベストアンサー1
考えられる理由の 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 ドキュメント:
具体的には、Swift はメソッドの最初のパラメータ名にデフォルトでローカル パラメータ名を与え、2 番目以降のパラメータ名にはデフォルトでローカル パラメータ名と外部パラメータ名の両方を与えます。この規則は、Objective-C メソッドの作成で慣れ親しんでいる一般的な命名規則と呼び出し規則と一致しており、パラメータ名を修飾する必要なく表現力豊かなメソッド呼び出しが可能になります。
オートコンプリートに注目してください: