在函数中传递闭包

时间:2017-10-21 15:02:52

标签: swift

我在Swift方面有一点经验,并且在函数中作为参数传递闭包时遇到问题。

//1.
public func changeMyStatus(to f:?, _ completion:@escaping (_ isSucced:Bool)->()){
    //

}
//2.
func goLive(_ completion:@escaping (_ isSucced:Bool)->()){

}
//3.
func goNonLive(_ completion:@escaping (_ isSucced:Bool)->()){

}

现在,我想在我的控制器中使用第一个函数,并希望将第二个/第三个函数作为参数传递。第一个闭包将返回true / false,具体取决于第二个/第三个闭包返回的内容。

i)我应该在第一个函数中添加什么类型?

另外我想从我的班级调用第一个函数

  changeMyStatus(to: goNonLive) { (isSuccess) in

    }

请帮助

2 个答案:

答案 0 :(得分:1)

您需要更改changeMyStatus功能签名和实现,如:

public func changeMyStatus(to f: (@escaping (Bool) -> ()) -> () , _ completion:@escaping (_ isSucced:Bool)->()){
    f { (status) in
        completion(status)
    }
}

您可以将这些功能称为:

// goLive
changeMyStatus(to: goLive(_:)) { (status) in
    print(status)
}


// goNonLive
changeMyStatus(to: goNonLive(_:)) { (status) in
    print(status)
}

答案 1 :(得分:0)

您的第二个和第三个函数的完成参数的类型为:(Bool -> Void) -> Void

因此,为了将其传递给您的第一个函数,请尝试以下方式:

public func changeMyStatus(to f: ((Bool) -> ()), _ completion:@escaping (_ isSucced:Bool)->()) { // Your body}

在Swift中,您需要将函数看作Int,Double,String等类型