2014-06-22 5 views
27

Sto giocando con HomeKit e sto cercando di aggiungere una nuova casa. Questo è il mio codice:Blocco di completamento HomeKit in Swift: impossibile convertire il tipo di espressione 'Void' in 'String!'

func addHome() 
{ 
    homeManager.addHomeWithName("My House", completionHandler: 
     { (error: NSError!, home: HMHome!) in 
      if error 
      { 
       NSLog("%@", error) 
      } 
     }) 
} 

Questo dà un errore di compilazione:

Cannot convert the expression's type 'Void' to type 'String!' 

Ho provato specificando un tipo di ritorno di Void:

... 
{ (error: NSError!, home: HMHome!) -> Void in 
... 

inutilmente. Qualcuno ha qualche idea su come risolvere questo problema? Passare il nil al gestore di completamento corregge l'errore, ma ovviamente voglio fare qualcosa al completamento.

risposta

5

I parametri per il completamento chiusura di Handler sono invertiti, dovrebbero essere:

Si noti inoltre che non è necessario specificare i tipi per i parametri, poiché la firma del metodo li ha specificati per voi, quindi è possibile semplicemente elencare i nomi dei parametri che si desidera utilizzare e verranno automaticamente garantiti per essere del tipo corretto, ad esempio:

homeManager.addHomeWithName("My House", completionHandler:{ 
    home, error in 
    if error { NSLog("%@", error) } 
    }) 

- modifica -

si noti inoltre che quando ho scritto 'puoi semplicemente elencare i nomi dei parametri che si desidera utilizzare, e lo faranno automaticamente si assicura che sia del tipo corretto ', vale a dire che verranno digitati in base all'ordine in cui sono elencati, ad es. se invece avessi usato error, home in, questi sarebbero i tuoi nomi parametro, tuttavia il parametro error sarebbe di tipo HMHome! e home sarebbe di tipo NSError! (poiché questo è l'ordine in cui compaiono nell'elenco dei parametri per la chiusura nel firma del metodo)

1

Gli argomenti vengono ordinati in modo incoerente; la firma per la completionHandler in addHomeWithName è

(HMHome!, NSError!) -> Void 

quindi utilizzare:

homeManager.addHomeWithName ("My House", completionHandler: 
    { (home: HMHome!, error: NSError!) in 
     if error { NSLog("%@", error) }}) 

Utilizzando una chiusura finale e permettendo al compilatore di dedurre i tipi consente di semplificare quanto sopra a:

homeManager.addHomeWithName ("My House") { 
    if $1 { NSLog ("%@", $1) } 
}