Nouveau sur Swift et je suis actuellement en train de passer une fonction en tant que paramètre facultatif de la manière suivante:

import Foundation 

func foo()
{
    print("Foo")
}

func bar()
{
    print("Bar")
}

func dummy()
{
    return
}

func myFunc()
{
    myFunc(callBack: dummy())
}

func myFunc(callBack: (Void))
{
    foo()
    callBack
}

myFunc()
myFunc(callBack: bar())

C'est-à-dire exploiter le polymorphisme

Cela semble être une façon peu élégante de faire cela, y a-t-il une meilleure façon,

Merci Tom

Éditer:

Je suis conscient que je pourrais raccourcir ceci en faisant:

import Foundation 

func foo()
{
    print("Foo")
}

func bar()
{
    print("Bar")
}

func dummy()
{
    return
}

func myFunc(callBack: (Void) = dummy())
{
    foo()
    callBack
}

myFunc()
myFunc(callBack: bar())

Mais je dirais quand même que c'est une solution inélégante

2
thoxey 20 nov. 2018 à 14:05

4 réponses

Meilleure réponse

Vous pouvez facilement définir une valeur par défaut pour une fonction en tant que paramètre:

func foo(completion: () -> Void = { }) {
    completion()
}

Vous pouvez également l'avoir nul par défaut:

func foo(completion: (() -> Void)? = nil) {

Lorsqu'il s'agit d'une fermeture facultative, vous devrez l'appeler comme ceci:

completion?()
6
LinusGeffarth 20 nov. 2018 à 11:50

Vous faites référence aux arguments par défaut:

Vous pouvez définir une valeur par défaut pour n'importe quel paramètre d'une fonction en attribuant une valeur au paramètre après le type de ce paramètre. Si une valeur par défaut est définie, vous pouvez omettre ce paramètre lors de l'appel de la fonction.

Vous avez donc besoin de quelque chose comme:

func myfunc (callback: ()->void = dummy) {

LinusGeffarth note que les rappels dans Swift sont appelés achèvement , ou fermeture comme avismara notes.

2
kabanus 20 nov. 2018 à 11:49

Code complet avec réponse appliquée:

import Foundation 

func foo()
{
    print("Foo")
}

func bar()
{
    print("Bar")
}

func myFunc(completion: () -> Void = { })
{
    foo()
    completion()
}

myFunc()
myFunc(completion: bar)
2
thoxey 20 nov. 2018 à 11:57

Euh, passez-vous la fonction en tant que paramètre facultatif? Il semble que vous ayez écrit une méthode qui accepte Void, vous avez une fonction qui accepte Void et vous appelez simplement cette méthode. Je ne vois aucune trace de polymorphisme ici sauf probablement que le myFunc a plusieurs signatures. Cette méthode est une solution inélégante non pas parce qu'elle est inélégante, mais parce que ce n'est pas une solution.

Voici un exemple correct de polymorphisme dans les systèmes fonctionnels:

func printA() {
    print("A")
}

func printB() {
    print("B")
}

//This method accepts a function as a parameter
func higherOrderPrinter(with print: () -> Void ) { 
    print() //Can be anything, depends on the method you send here. Polymorphism much? :)
}

higherOrderPrinter(with: printA) //Prints A. See carefully how I am NOT doing printA()
higherOrderPrinter(with: printB) //Prints B
//In fact...
higherOrderPrinter {
    print("C") 
} //Prints C
1
avismara 20 nov. 2018 à 11:44