[Swift] Passare una closure come argomento di funzione

di il
2 risposte

[Swift] Passare una closure come argomento di funzione

Salve a tutti, ho un prolema nel passare una closure come argomento di una funzione
func funzioneStandard( numero: Int, msg: String, onEndFunc: (variabile: AnyObject) -> Bool ) -> Void{
	let key : Int
	if( msg == "messaggio" ){
		key = numero * 5 / 2
	}
	else{
		key = numero +1
	}

	msg += "_END"
	let isLunghezzaPari = onEndFunc( variabile: msg )
}


funzioneStandard(4, "test", {(variabile : AnyObject) -> Bool in
	return count(variabile) % 2
})

2 Risposte

  • Re: [Swift] Passare una closure come argomento di funzione

    Ciao, nel tuo codice noto qualche problema:
    • Di default in Swift i parametri vengono passati come costanti, per cui dovresti avere un errore in compilazione quando cerchi di modificare "msg". Puoi risolvere mettendo:
      
      func funzioneStandard(numero: Int, var msg: String, onEndFunc: (variabile: AnyObject) -> Bool) -> Void {
      ...
      }
      
    • La closure che passi alla funzione deve restituire un valore Bool, mentre tu restituisci un numero.
    Nota inoltre che puoi sfruttare l'inferenza del tipo dei parametri della closure e la sintassi della "trailing closure" per scrivere una closure molto più compatta. Ad esempio:
    
    funzioneStandard(12, msg: "test") { variabile in
        let s = variabile as! String
        return s.characters.count % 2 == 0
    }
    
    (nota che s.characters.count è l'equivalente in Swift 2.0 della funzione count() di Swift 1.x).

    In particolare la "trailing closure" fa sì che se la closure è l'ultimo parametro della funzione allora puoi scrivere la closure tra parentesi graffe al di fuori della funzione stessa, ovvero:
    nomeFunzione(parametro1, parametro2) { closure }
    L'inferenza del tipo, invece, fa sì che tu possa omettere il tipo dei parametri della closure (perché è possibile ottenerne il tipo dalla signature di "funzioneStandard"). In questo modo l'istruzione
    
    funzioneStandard(4, "test") { (variabile: AnyObject) in <corpo>}
    
    diventa
    
    funzioneStandard(4, "test") { variabile in <corpo> }
    
  • Re: [Swift] Passare una closure come argomento di funzione

    Grazie della risposta
Devi accedere o registrarti per scrivere nel forum
2 risposte