2017-04-03 61 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/Conceptual/Swift_Programming_Language/Functions.html#// apple_ref/doc/uid/TP40014097-CH10-ID166) – Hamish

+0

Got you!感謝您的鏈接 – konyv12

回答

4

在Swift中,所有參數都被命名。但是,有時這可能會變得繁瑣或導致函數內部的怪異參數名稱。舉例來說,如果你有一個看起來像

func makeNewThing(fromDifferentThing: SomeThing) 

會覺得不可思議指函數的參數作爲fromDifferentThing在函數內部的功能。

要解決這個問題,Swift可以讓你給出相同的函數參數兩個的名字。一個參數名稱將被用於以外的的功能,另一個名字將被用於裏面的的功能。外部參數名稱被稱爲參數標籤,內部名稱通常被稱爲參數名稱

所以在我的例子中,你可以定義你的功能

func makeNewThing(fromDifferentThing thing: SomeThing) 

,然後參考參數爲thing裏面的功能,但調用該函數作爲

makeNewThing(fromDifferentThing: thing) 

的下劃線也與此有關。有些函數並不需要解釋他們的參數是什麼,所以Swift允許你說你函數的第一個參數是沒有參數標籤。你會叫這樣的功能只是爲:

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將是UIApplication型和launchOptions將類型[IApplicationLaunchWithOptionsKey: any]

的是什麼下劃線的第一個參數之前是什麼意思?

這兩個問題是相關的。這兩個名字中的第一個名爲變元標籤。如果存在,這是您在調用方法時在冒號前寫的內容。如果缺席,則參數名稱將成爲其標籤。如果您不需要參數的參數標籤,請改爲寫下劃線(_)。

下面是這三個選項的摘要:

  • 有一個參數標籤和名稱 - func foo(bar baz:String),叫foo(bar:"Hello")
  • 只有一個參數名稱 - func foo(baz:String),叫foo(baz:"Hello")
  • 使用下劃線_作爲參數標籤 - func(_ baz:String),致電foo("Hello")
+0

在這種情況下,我還要補充說,參數標籤是用於「歷史」原因。在Objective-C中,該函數被稱爲' - (BOOL)應用程序:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions'。所以在將它轉換爲Swift時,他們使用參數標籤來使它看起來與Objective-C掛件相似。 – JoRa

+0

所以,如果你不添加下劃線,當你調用方法時,你不需要指定任何字符串,只需要傳入的值(類似於JavaScript)? – konyv12

+0

@ konyv12反過來:如果你添加下劃線,那麼你可以傳遞沒有標籤的參數。查看編輯。 – dasblinkenlight

相關問題