2015-07-12 106 views
0

函數符號的問題我在學習斯威夫特(以下蘋果的教程),我碰到過這種表示:關於斯威夫特

optional func imagePickerController(_ picker: UIImagePickerController, 
    didFinishPickingMediaWithInfo info: [String : AnyObject]) 

在這種情況下什麼是_是什麼意思? didFinishPickingMediaWithInfo和info字典之間的關係是什麼(顯然它不是那種在冒號後面提供的類型)?

回答

3

當定義一個函數或方法參數,除了類型,每個參數必須具有一個本地名稱,其識別從該函數的主體中的變量訪問的名稱,但它也可以有一個外部名稱,在調用該函數時使用。

func doSomething(externalName internalName: Int) { 
    print(internalName) 
} 

doSomething(externalName: 4) 

用下劃線代替外部名稱意味着沒有爲該參數定義外部名稱。在上面的例子「:

func doSomething(_ internalName: Int) { 
    print(internalName) 
} 

表示該功能是通過將參數,而不受外部名稱被加前綴被調用:

doSomething(5) 

外部名稱來識別每個參數是什麼是有用的,使代碼更易於閱讀。例如,比較這:

update(33, 1, data) 

與此:

update(invoiceId: 33, itemId: 1, invoiceDetails: data) 

因爲它的實用性,當沒有明確指定時,Swift會自動「提升」本地名稱到外部名稱。在斯威夫特的1.x:

  • 全球所有的功能都沒有默認外部名稱
  • 所有方法都參數,但第一個自動生成的外部名稱
  • 所有初始化具有自動生成的外部名

在Swift 2.0中,全局函數遵循與方法相同的規則。

自動生成的外部名稱意味着,例如,像這樣的功能:

func updateInvoice(invoiceId: Int, invoiceDetailId: Int, invoiceDetail: data) 

將自動具有其簽名更新爲:

func updateInvoice(invoiceId: Int, invoiceDetailId invoiceDetailId: Int, invoiceDetail invoiceDetail: data) 
            ^^^^^^^^^^^^^^^      ^^^^^^^^^^^^^ 

與自動增加一個外部名的到兩個第二和第三(即第一個之後的所有參數)。

你的情況:

optional func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) 

第一個下劃線表示:不使用,也不該參數產生外部名。至於第二個參數,在調用該函數時引用爲didFinishPickingMediaWithInfo,但它將作爲名爲info的變量提供給imagePickerController

推薦閱讀:Function Parameter Names

0

檢查本文http://natashatherobot.com/swift-parameter-names-in-functions/

它說明在一個函數/方法簽名使用的「_」的含義。

+1

因此,在這種情況下'didFinishPickingMediaWithInfo'是參數名稱,如果你調用的函數和'info'是你會在功能的實現使用的名稱,你會提供哪些資料? –

+1

這不是所謂的揭祕參數名稱。你鏈接了一篇文章,解釋了Swift如何處理參數名稱。這是文章的本地名稱,而不是該主題的全球名稱。 –

+0

它被稱爲通配符表達式。 – Boon