Swift中的HomeKit完成块:无法将表达式的类型'Void'转换为'String!'类型

时间:2014-06-22 04:56:52

标签: ios closures swift homekit

我正在玩HomeKit,我正在尝试添加一个新家。这是我的代码:

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

这会产生编译错误:

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

我已尝试指定返回类型Void

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

无济于事。有没有人有任何想法如何解决这个问题?将nil传递给完成处理程序会修复错误,但我当然希望在完成时执行某些操作。

2 个答案:

答案 0 :(得分:7)

您的completionHandler闭包的参数是相反的,它们应该是:

(home: HMHome!, error: NSError!)

另请注意,您无需指定参数的类型,因为方法签名为您指定了它们 - 因此您只需列出要使用的参数名称,它们将自动确保为正确的类型,例如:

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

- 修改 -

另请注意,当我写'时,您只需列出您要使用的参数名称,它们将自动确保为正确类型',也就是说它们将会根据列出的顺序输入 - 例如如果您使用了error, home in,那么这些将是您的参数名称,但参数error的类型为HMHome!,而home的类型为NSError! (因为这是它们出现在方法签名中闭包的参数列表中的顺序)

答案 1 :(得分:1)

你的论点是不一致的; completionHandleraddHomeWithName的签名是

(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) }
}