54

我正在玩 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给完成处理程序可以修复错误,但我当然想在完成时做一些事情。

4

2 回答 2

10

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

(home: HMHome!, error: NSError!)

另请注意,您不需要指定参数的类型,因为方法签名已为您指定了它们 - 因此您可以简单地列出您要使用的参数名称,它们将自动被保证是正确的类型, 例如:

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

--编辑--

另请注意,当我写“您可以简单地列出您要使用的参数名称,它们会自动确保它们是正确的类型”时,也就是说它们将按照它们的顺序键入列出 - 例如,如果您使用error, home in了,那么这些将是您的参数名称,但是参数error将是 type HMHome!,并且home是 type NSError!(因为这是它们出现在方法签名中闭包的参数列表中的顺序)

于 2014-06-22T06:06:41.347 回答
1

你的论点顺序不一致;completionHandlerin的签名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) }
}
于 2014-06-22T05:54:41.847 回答