Блок завершения HomeKit в Swift: невозможно преобразовать тип выражения 'Void', чтобы ввести 'String!'

Я играю с HomeKit, и я пытаюсь добавить новый дом. Это мой код:

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

Это дает ошибку компилятора:

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

Я попытался указать тип возврата Void:

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

но безрезультатно. Кто-нибудь есть идеи, как это исправить? Ошибка передачи nil обработчику завершает ошибку, но, конечно, я хочу что-то сделать при завершении.

Ответ 1

Параметры для вашего закрытия закрытия Handler меняются на противоположные, они должны быть:

(home: HMHome!, error: NSError!)

Также обратите внимание, что вам не нужно указывать типы для параметров, так как сигнатура метода указала их для вас - таким образом, вы можете просто перечислить имена параметров, которые хотите использовать, и они автоматически будут уверены, что они имеют правильный тип, например:

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

--редактировать--

Также обратите внимание, что когда я писал "вы можете просто перечислить имена параметров, которые хотите использовать, и они автоматически будут уверены, что они имеют правильный тип", то есть они будут напечатаны в соответствии с порядком, в котором они находятся перечисленные - например, если вы использовали error, home in вместо error, home in, то это будут ваши имена параметров, однако error параметра будет типа HMHome! , и home был бы типа NSError! (так как это порядок, в котором они появляются в списке параметров для закрытия в сигнатуре метода)

Ответ 2

Ваши аргументы упорядочены непоследовательно; подпись для completionHandler в addHomeWithName

(HMHome!, NSError!) -> Void

таким образом, используйте:

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

Используя трейлинг-закрытие и позволяя компилятору вывести типы, вы можете упростить описанное выше:

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