Swift 2 - 在函数中用作参数

时间:2016-01-02 23:16:59

标签: function parameters swift2

我有一个函数,因为参数有两个其他函数。 我的代码工作正常但是,当我调用函数时,我很乐意看到参数的名称。

这是我的功能:

func dispatchSuperMain(global_queue:()->(), main_queue:()->()) {

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {

            global_queue()

            dispatch_async(dispatch_get_main_queue(), {

                main_queue()

            })

        })
    }

我使用:(工作)

调用该函数
dispatchSuperMain({ () -> () in
            //global_queue code
            }) { () -> () in
            //main_queue code
}

如何格式化函数以查看参数名称?

例如我想调用我的函数:(不工作)

dispatchSuperMain( global_queue: { () -> () in
            //global_queue code
            }) main_queue: { () -> () in
            //main_queue code
}

1 个答案:

答案 0 :(得分:0)

函数/闭包作为高阶函数的参数在与常规函数的普通类型参数相同的规则下工作。高阶函数的添加是你可以将最后一个闭包放在一个尾随闭包上,在调用函数时放在parantheses之外和之后(正如你在上面例子中为第二个函数参数所做的那样)。

无论如何,对于高阶函数中的第一个函数参数,显式添加一个外部参数名称(否则为函数的第一个参数省略)。要使用第二个函数参数的现有外部参数名称,只需在调用它时将两个闭包放在函数parantheses中。

举个例子,考虑

func f(fun1 fun1: (Int) -> (Int), fun2: (Int) -> (Int)) -> Int {

    let a = 1
    let b = fun1(a)
    let c = fun2(a)

    return b+c
}

let a = f(fun1: { 2*$0 }, fun2: { 3*$0 } )

print(a) // 5

或者,void的简化版 - 功能示例

func g(global_queue global_queue: () -> (), main_queue: () -> ()) {
    global_queue() // prints "global"
    main_queue() // prints "main"
}

g(global_queue: { print("global") }, main_queue: { print("main") })

如果您选择以最终闭包作为尾随调用函数,我认为不可能使用其外部参数名称。这有点隐含地解释,因为我们被允许使用尾随闭包而不使用外部名称来进行此闭包,即使它不是函数的第一个参数。例如。对于常规函数,我们必须始终为函数调用提供外部名称(对于除第一个以外的参数),除非我们在函数签名中的相应参数中明确添加前缀_

func h(a: Int, b: Int) {} 
h(1, 2)    // error: missing argument label 'b:' in call
h(1, b: 2) // ok

func hI(a a: Int, _ b: Int) {}
hI(1, 2) // ok