2017-09-01 12 views
1

即使在官方的Apple Docs中不存在,如何在Swift中使用更短的方法簽名?在Swift中如何以及何時使用更短的方法簽名?

例如:

let workerQueue = DispatchQueue(label: "com.test.worker", attributes: .concurrent) 

當我瀏覽文檔,我看到的唯一方法是這些:

func async(group: DispatchGroup?, qos: DispatchQoS, flags: DispatchWorkItemFlags, execute:() -> Void) 

func asyncAfter(deadline: DispatchTime, execute: DispatchWorkItem) 

因此,如何以及爲什麼這是可能的:

workerQueue.asynch(group: slowAddGroup) { 
    //... 
} 
+5

請閱讀[Swift Language Guide:Closures](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Closures.html)中的* Trailing Closures *部分*和默認參數在[Swift語言指南:函數]中的值*(https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html#//apple_ref/doc/uid/TP40014097-CH10-ID158 ) – vadian

+0

我找到並閱讀它。您可以通過在該參數的類型之後爲該參數分配一個值來爲函數中的任何參數定義默認值。如果定義了默認值,則可以在調用該函數時省略該參數。這正是我所困惑的。謝謝。 –

回答

2

由於兩個原因,這種特定的簡寫是可能的:輸入參數和尾隨閉包的默認值。 看一看該函數的實際類型簽名:

func async(group: DispatchGroup? = default, qos: DispatchQoS = default, flags: DispatchWorkItemFlags = default, execute work: @escaping() -> Void)

你可以清楚地看到,所有的輸入參數都具有除關閉默認值。如果你忽略了其中的任何一個,編譯器將使用默認值。

由於work是一個閉包,它是函數的最後一個輸入參數,作爲簡寫符號,您可以將它移動到括號外,並在函數調用後將其寫爲trailing closure

1

默認parametrers設置爲默認值...見自己,聲明功能

func doSomething(withThis this: Any, andOptional optional: Any? = nil) { 
// Do smth incredible 
} 

現在嘗試自動完成你自己的,它應該完成你2個功能,即使你宣佈一個......那是因爲你在函數聲明默認參數值設置:)

1

的實際方法簽名是:

public func async(group: DispatchGroup? = default, qos: DispatchQoS = default, flags: DispatchWorkItemFlags = default, execute work: @escaping @convention(block)() -> Swift.Void) 

所有=分配是默認值。因此,您正在指定組並將所有其他組作爲default

相關問題