2014-07-17 14 views
5

1) Sto utilizzando una variabile come primo argomento in UIView.animateWithDuration in questo modo:Swift: Mancare argomento per il parametro

var theDelay: Float = 1.0 
    UIView.animateWithDuration(theDelay, animations: { 
    cell.frame.origin.y = 0 
}) 

e Xcode6 (Beta 3) mi sta dando un errore di generazione: 'argomento mancante per parametro 'ritardo' nella chiamata '.

Quando non utilizzo una variabile, la funzione funziona correttamente. Mi piacerebbe modificare la variabile (dato che questo codice è all'interno di un ciclo) quando ho scoperto questo problema.

2) In alternativa, potrei saltare usando una variabile e comprendono il calcolo in linea:

UIView.animateWithDuration(indexPath.row * 1.0, animations: { 
    cell.frame.origin.y = 0 
}) 

ma io sono sempre lo stesso errore di ritardo 'argomento per il parametro mancante '' in call'.

Cosa sto facendo di sbagliato qui?

risposta

9

Il messaggio di errore è fuorviante. Il primo parametro di animateWithDuration() ha il tipo NSTimeInterval (che è un Double), ma si passa un argomento Float. Swift non converte implicitamente i tipi.

Cambiare la definizione della variabile per

let theDelay = 1.0 

o una conversione esplicita

UIView.animateWithDuration(NSTimeInterval(indexPath.row), animations: { 
    cell.frame.origin.y = 0 
}) 

dovrebbe risolvere il problema.

In Swift 3 questo sarebbe

let theDelay = TimeInterval(indexPath.row) 
UIView.animate(withDuration: theDelay, animations: { 
    cell.frame.origin.y = 0 
}) 
+0

Ricevo di nuovo questo errore in nuove parti del mio codice in XCode 6 Beta 5. Con o senza un parametro Double o NSTimeInterval esplicito. – jaime

+0

Hmmm. L'ho risolto aggiungendo esplicitamente UIKit all'elenco delle librerie in Fasi di creazione. – jaime

+0

Va bene, potrebbe essere che stavo assegnando un CGFloat a NSLayoutConstraint invece di NSLayoutConstraint.constant nel blocco di animazione. Quindi, se hai questo problema, potrebbe esserci un altro problema nel tuo blocco che Swift non ti sta dicendo direttamente. Una volta risolto anche questo errore, questo errore è andato via e il codice è stato eseguito. – jaime

1

lingua realtà Swift viene digitato e bisogno di passare stessi argomenti di tipo come definito Non c'è cast implicito in rapida.

Come animateWithDuration in decleration

class func animateWithDuration(duration: NSTimeInterval, animations: (() -> Void)!) // delay = 0.0, options = 0, completion = NULL 

ha tipo di parametro di NSTimeInterval che viene dichiarato come double se si vede la sua dichiarazione

typealias NSTimeInterval = Double 

Quindi è necessario Double valore del parametro non Float valore. Quando chiami il secondo tempo nel tuo codice rispetto a swift usa il tipo interfrence i.e sta automaticamente definendo (non convertendo float in double) il tuo indexPath.row * 1.0 in Double. Il codice sotto funziona bene.

var theDelay: NSTimeInterval = 1.0 

o

var theDelay: Double = 1.0 //this is same as above 
UIView.animateWithDuration(theDelay, animations: { 
    cell.frame.origin.y = 0 
}) 

compilatore è fuorviante voi.Quindi sempre passare il tipo di parmeter come definito in Swift

3

Ho anche ricevuto questo errore da un errore totalmente non correlato nel blocco di animazioni; Stavo già passando un valido NSTimeInterval. Non aveva nulla a che fare con il parametro delay, quindi l'errore che mi mostrava era sbagliato e mi faceva girare in cerchio per un po '.

Quindi assicuratevi di non avere errori all'interno del blocco di animazioni.

UIView.animateWithDuration(interval, animations: {() -> Void in // compiler will complain about this line missing a parameter 
      // some code 
      // some code with a syntax error in it, but Xcode won't show the error 
      // some code 
     }) 
+0

Buona cattura, ho avuto lo stesso problema. Necessario per spostare il codice fuori dal blocco di animazione per far sì che il compilatore mostri il problema reale. Dannazione! – fish

Problemi correlati