2014-06-22 22 views
27

Gram w HomeKit i próbuję dodać nowy dom. To jest mój kod:Blok ukończenia HomeKit w Swift: Nie można przekonwertować typu wyrażenia "Void" na typ "String!"

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

To daje błąd kompilatora:

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

Próbowałem określając typ zwracany z Void:

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

bezskutecznie. Czy ktoś ma jakieś pomysły, jak to naprawić? Przekazywanie nil do obsługi zakończenia naprawia błąd, ale oczywiście chcę coś zrobić po zakończeniu.

Odpowiedz

5

Parametry zakończenia realizacjiOdrzucane są odwrotnie, powinny być:

(home: HMHome!, error: NSError!) 

Należy również pamiętać, że nie trzeba określać typów parametrów, ponieważ sygnatura metody je dla nich podała - w ten sposób można po prostu podać nazwy parametrów, które będą używane, i będą automatycznie być odpowiedniego typu, na przykład:

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

- edycji -

Należy również pamiętać, że gdy pisałem „można po prostu wymienić nazwy parametrów, które chcesz użyć, i będą automatycznie uzyskasz pewność, że jest poprawnego typu ", to znaczy, że zostaną wpisane zgodnie z kolejnością, w jakiej są wymienione - np. jeśli zamiast tego użyłbyś error, home in, to byłyby to twoje nazwy parametrów, jednak parametr error byłby typu HMHome!, a home byłby typu NSError! (ponieważ jest to kolejność, w jakiej pojawiają się one na liście parametrów dla zamknięcia w podpis metody)

1

Twoje argumenty są uporządkowane niekonsekwentnie; podpis na completionHandler w addHomeWithName jest

(HMHome!, NSError!) -> Void 

więc używać:

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

Korzystanie zamknięcie krocząca i pozwalając kompilator wywnioskować typy pozwala uprościć powyższe do:

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