2017-04-03 8 views
1

これは非常に初心者質問ですが、私はいつもこの方法では、たとえばことを不思議に思ったために:Swiftのメソッドは、型のない引数を持つことができるのはなぜですか?

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool

は、なぜ我々は、引数としてdidFinishLaunchingWithOptionsを持っているのですか? applicationはタイプUIApplication、launchOptionsはタイプUIApplicationLaunchWithOptionsKey: anyとなることを理解していますが、私が意味することを知っていれば、didFinishLaunchingWithOptionsと呼ばれるこの「スタブ」をなぜ持っていますか?

また、アンダースコアは最初の引数の前に何を意味しますか?私は何度もそこに置く必要があったので、私の機能はうまくいくはずでした。

+2

[引数ラベル](https://developer.apple.com/library/content/documentation/スウィフト/概念/ Swift_Programming_Language/Functions.html#// apple_ref/DOC/UID/TP40014097-CH10-ID166) – Hamish

+0

ガットます!リンクのおかげで – konyv12

答えて

4

すべてのパラメータに名前が付けられます。しかし、時にはこれが面倒になるか、関数内で奇妙なパラメータ名につながることがあります。たとえば、あなたはそれが関数の内部fromDifferentThingとして、関数の引数を参照するために奇妙な感じでしょう

func makeNewThing(fromDifferentThing: SomeThing) 

のように見える機能を持っている場合。

これを回避するには、同じ関数引数に2つのという名前を付けることができます。 1つの引数名はの外にの機能を使用し、もう1つの名前はの中にの機能を使用します。外側の引数名は引数ラベルと呼ばれ、内側の名前は通常というパラメータ名と呼ばれます。

だから私の例の場合、あなたは

func makeNewThing(fromDifferentThing thing: SomeThing) 

としてあなたの関数を定義することができ、その後、関数内thingとして引数を参照してください、しかし

makeNewThing(fromDifferentThing: thing) 

としての機能を呼び出しますアンダースコアもこれに関連しています。スウィフトは、あなたがあなたの関数の最初の引数は引数なしラベルていると言うことができますので、いくつかの機能は本当に、その引数が何であるかを説明する必要はありません。あなたは、単にこのような機能を呼び出します。

function(argument1, label2: argument2, label3: argument3...) 

をし、としてそれを定義しますのです

func function(_ argument1: Type1, label2 argument2: Type2, /* ...and so on */) 
+1

すべてのパラメータに名前がついているわけではありません。 'func foo(_:String){}'は無意味ですが、合法です。 – Hamish

+0

偉大な答えは、多くのことを、おかげで清算しました。 – konyv12

2

私はapplicationは、アンダースコアが最初の引数の前に何を意味しているタイプの[IApplicationLaunchWithOptionsKey: any]

なり種類UIApplicationlaunchOptionsのものであろうことを理解できますか?

これら2つの質問は関連しています。 2つの名前のうちの最初の名前は、引数ラベルと呼ばれます。存在する場合、これはメソッドを呼び出すときにコロンの前に書くものです。存在しない場合、パラメータ名はそのラベルになります。パラメータの引数ラベルを必要としない場合は、代わりにアンダースコア(_)を記述します。ここで

は、これらの3つのオプションの要約です:

  • は、引数のラベルと名前持っている - foo(baz:"Hello")
  • を呼び出し、 func foo(baz:String) - foo(bar:"Hello")
  • が唯一の引数名を持って呼び出し、func foo(bar baz:String)
  • 引数ラベル - func(_ baz:String)にはアンダースコア_を使用し、foo("Hello")
+0

この場合、引数ラベルは '歴史的な理由から使用されます。 Objective-Cで関数が 'と呼ばれるように - (BOOL)アプリケーション:(のUIApplication *)アプリケーションdidFinishLaunchingWithOptions:(NSDictionaryの*)launchOptions'。だから、それをSwiftに変換するとき、彼らはObjective-Cペンダントに似て見えるように引数のラベルを使いました。だから、 – JoRa

+0

あなたが任意の文字列、あなたは(JavaScriptに似た)に渡したいだけの値を指定する必要はありませんメソッドを呼び出すときに、アンダースコアを追加しない場合は? – konyv12

+0

konyv12 @それは周りに他の方法です:あなたは、アンダースコアを追加した場合、あなたはラベルなしでパラメータを渡すことができます。編集を参照してください。 – dasblinkenlight

関連する問題