2017-10-21 25 views
0

我在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 

    } 

请帮助

+0

您想调用的isSuccess是从您的changeMyStatus函数还是您的传递函数goNonLive? – Arrabidas92

回答

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) 
} 
+0

还有一个问题,如果我改变函数goLive和goNonLive来改变这个函数的类型,完成:@escaping(_ isSucced:Bool) - >()){ } – Gour

+0

@Gour:它应该像:'f:(_ str:String,@escaping(Bool) - >()) - >( )' –

0

你的第二个和第三个函数具有完成参数,类型的:(Bool -> Void) -> Void

所以在为了将它传递给你的第一个功能,请尝试这种方式:

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

在斯威夫特,你需要看到一个函数作为一个类型如int,双,字符串...

+1

感谢您的答案@Arrabidas。但是,你错过了f中的“@escaping”。 – Gour

+0

好吧,我只是想念@escaping关键字? – Arrabidas92

+0

还有一个问题,如果我改变函数goLive和goNonLive来调用这个函数,将会是什么类型的f goLive(_ myStr:String,_ completion:@escaping(_ isSucced:Bool) - >()){} – Gour