2017-10-21 51 views
0

J'ai un peu d'expérience dans Swift et je fais face à un problème pour passer une fermeture dans une fonction en tant que paramètre. Maintenant, je veux utiliser la première fonction dans mon contrôleur et veut passer la deuxième/troisième fonction en tant que paramètre. La fermeture en premier retournera vrai/faux selon ce qui est retourné par la fermeture en deuxième/troisième.Passer une fermeture dans une fonction

i) Quel sera le type que je devrais mettre en première fonction?

Je veux aussi appeler d'abord fonction de ma classe comme celui-ci

changeMyStatus(to: goNonLive) { (isSuccess) in 

    } 

s'il vous plaît aider

+0

L'isSuccess que vous voulez appeler est-il de votre fonction changeMyStatus ou de votre fonction passée goNonLive? – Arrabidas92

Répondre

1

Vous devez changer la signature de la fonction changeMyStatus et mise en œuvre comme:

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

Vous pouvez appeler ces fonctionne comme:

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


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

Encore une question quel sera le type de f si je change la fonction goLive et goNonLive pour lke ce func goLive (_ myStr: String, _ achèvement: @escaping (_ isSucced: Bool) ->()) { } – Gour

+0

@Gour: Il devrait être comme: 'f: (_ str: String, @escaping (Bool) ->()) -> () ' –

0

Votre deuxième et troisième fonction a un paramètre d'achèvement avec un type de: (Bool -> Void) -> Void

Ainsi, dans Pour passer à votre première fonction, essayez de cette façon:

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

Swift, vous devez voir une fonction comme un type comme Int, Double, String ...

+1

Merci pour votre réponse @Arrabidas. Mais, vous avez manqué '@escaping' dans f. – Gour

+0

D'accord, le mot-clé @escaping me manque-t-il? – Arrabidas92

+0

Encore une question quel sera le type de f si je change la fonction goLive et goNonLive pour lke cette fonction goLive (_ myStr: String, _ completion: @escaping (_ isSucced: Bool) ->()) {} – Gour