如果可以在Swift中使用较短的方法签名,即使它们不在Apple官方文档中,也会怎样?
例如:
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) {
//...
}
答案 0 :(得分:3)
这种特殊的简写可能有两个原因:输入参数和尾随闭包的默认值。 看看函数的实际类型签名:
func async(group: DispatchGroup? = default, qos: DispatchQoS = default, flags: DispatchWorkItemFlags = default, execute work: @escaping () -> Void)
您可以清楚地看到所有输入参数都具有默认值,闭包除外。如果省略其中任何一个,编译器将使用默认值。
由于work
是一个闭包,它是函数的最后一个输入参数,作为简写符号,你可以将它移到括号之外,然后在函数调用之后写入它,称为{{ 3}}
答案 1 :(得分:1)
默认参数设置为默认值...自己查看,声明函数
func doSomething(withThis this: Any, andOptional optional: Any? = nil) {
// Do smth incredible
}
现在尝试自己完成自动完成,它应该完成你的2个函数,即使你声明了一个...那是因为你在函数声明中设置默认参数值:)
答案 2 :(得分:1)
实际的方法签名是:
def default(self, o):
try:
iterable = iter(o)
except TypeError:
pass
else:
return list(iterable)
# Let the base class default method raise the TypeError
return JSONEncoder.default(self, o)
所有public func async(group: DispatchGroup? = default, qos: DispatchQoS = default, flags: DispatchWorkItemFlags = default, execute work: @escaping @convention(block) () -> Swift.Void)
分配均为默认值。因此,您要指定该组,并将所有其他组保留为=
。