HomeKit-aanvullingsblok in Swift: kan het type ‘Void’ van de uitdrukking niet converteren naar het type ‘String!’

Ik speel met HomeKit en ik probeer een nieuw huis toe te voegen. Dit is mijn code:

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

Dit geeft een compilerfout:

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

Ik heb geprobeerd een retourtype Voidop te geven:

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

het mocht niet baten. Heeft iemand enig idee hoe dit op te lossen? Door nildoor te geven aan de voltooiingshandler wordt de fout verholpen, maar ik wil natuurlijk iets doen na voltooiing.


Antwoord 1, autoriteit 100%

De parameters voor uw completionHandler-afsluiting zijn omgekeerd, ze zouden moeten zijn:

(home: HMHome!, error: NSError!)

Houd er ook rekening mee dat u de typen voor de parameters niet hoeft op te geven, aangezien de handtekening van de methode ze voor u heeft gespecificeerd – u kunt dus eenvoudig de parameternamen vermelden die u wilt gebruiken, en ze zullen automatisch worden gegarandeerd het juiste type, bijvoorbeeld:

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

bewerken

Houd er ook rekening mee dat toen ik ‘u gewoon de parameternamen die u wilt gebruiken, kunt vermelden, dat ze automatisch van het juiste type zijn’, dat wil zeggen dat ze worden getypt in de volgorde waarin ze zijn vermeld – bijv als je in plaats daarvan error, home inhad gebruikt, dan zouden dat je parameternamen zijn, maar de parameter errorzou van het type HMHome!zijn, en homezou van het type NSError!zijn (aangezien dat de volgorde is waarin ze verschijnen in de parameterlijst voor de afsluiting in de handtekening van de methode)


Antwoord 2, autoriteit 10%

Uw argumenten zijn inconsistent geordend; de handtekening voor de completionHandlerin addHomeWithNameis

(HMHome!, NSError!) -> Void

gebruik dus:

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

Door een afsluitende afsluiting te gebruiken en de compiler toe te staan ​​de typen af ​​te leiden, kunt u het bovenstaande vereenvoudigen tot:

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

Other episodes