2017-10-21 26 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