我正在玩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
传递给完成处理程序会修复错误,但我当然希望在完成时执行某些操作。
答案 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)
你的论点是不一致的; 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) }
}