怎么可以在Swift中使用更短的方法签名?

时间:2017-09-01 18:10:31

标签: swift

如果可以在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) {
    //...
}

3 个答案:

答案 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) 分配均为默认值。因此,您要指定该组,并将所有其他组保留为=