2014-06-22 21 views
27

我正在玩HomeKit,我正在嘗試添加一個新房。這是我的代碼:Swift中的HomeKit完成塊:無法將表達式的類型'Void'轉換爲鍵入'String!'

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傳遞給完成處理程序可修復錯誤,但當然我想完成某些操作。

回答

5

完成處理程序關閉的參數是相反的,它們應該是:

(home: HMHome!, error: NSError!) 

另請注意,由於方法簽名爲您指定了參數,因此您無需指定參數的類型 - 因此您可以簡單列出要使用的參數名稱,並且它們將自動保證是正確的類型,例如:

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

- 編輯 -

還要注意的是,當我寫「你可以簡單地列出你想使用的參數名稱,他們將自動保證是正確的類型',也就是說,它們將按照它們列出的順序被鍵入 - 例如,如果您使用的是error, home in,那麼這些將是您的參數名稱,但參數error將是HMHome!類型,並且home將是NSError!類型(因爲這是它們在參數列表中出現在方法的簽名)

1

您的論點排序不一致;在addHomeWithNamecompletionHandler簽名

(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) } 
} 
相關問題