ios - チュートリアル - swift ダウンロード



Swift:コール中に引数ラベル 'xxx'がありません (4)

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")

どうして ? もし2つ以上のvarをfuncに入れたら、この関数を呼び出すときに最初のvarの代わりにvarの名前を書く必要がある
それは本当に問題で、iBook Swiftのチュートリアルでは何も説明がありません。

https://ffff65535.com


Swift 3.0アップデート:

Swift 3.0では、1つの入力に1つのパラメータ名を持つメソッドは、そのパラメータ名を関数呼び出しの一部として持つ必要があります。 したがって、このような関数を定義すると

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

あなたの関数呼び出しは、このようにする必要があります

self.say(name: "Henry",msg: "Hi,Swift")

読みやすいファンクションラベルを英語にしたいが、入力パラメータ名を変更したくない場合は、このようにパラメータ名の前にラベルを追加することができます

func say(somethingBy name:String, whoIsActuallySaying msg:String) {
    print("\(name) say \(msg)")
}

それでこのように呼ぶ

self.say(somethingBy: "Henry",whoIsActuallySaying: "Hi,Swift")

シンプル:

誤った呼び出し関数の構文(c / c ++ / java / c#と同じではない)

間違っています:

say("Henry")

正しい:

say(name:"Henry")

PS:あなたはいつもそうです! 値の前に " name function parameter "を追加してください


これは単にObjective-C言語の影響です。 メソッドを呼び出すとき、メソッドの最初のパラメータは明示的にラベル付けする必要はありません(Objective-Cのように、メソッドの名前によって効果的にラベル付けされます)。 しかし、それに続くすべてのパラメータには、それらを識別するための名前が必要です。 メソッド自体の中で使用するために(オプションの)ローカル名をとることもできます(上記のコメントのJiaaroのリンクを参照してください)。


考えられる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メソッドを記述する際に慣れ親しんだ典型的な命名規則と呼び出し規則に一致し、パラメータ名を修飾する必要がない表現豊富なメソッド呼び出しを実現します。

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





swift