2014-06-05 7 views
6

ich ein Protokoll mit einem Verfahren definiert haben ein Tupel zurück:Rückkehr Tuple Von Delegate (Wert des optionalen Typ nicht ausgepackt)

protocol SMCalculatorDelegate { 

    func numbersToAdd() -> (Int, Int) 

} 

Wenn ich versuche, wie dies in meiner Klasse dies gegen die delegierte Methode aufrufen :

class SMCalculator: NSObject { 

    var delegate : SMCalculatorDelegate? 

    func add() { 

     let myTuple : (n1: Int, n2: Int) = delegate?.numbersToAdd() 

    } 

} 

ich erhalte die auf der Linie folgende Fehler let myTuple... Bezugnahme auf die .numbersToAdd() Abschnitt dieser Codezeile zu starten.

Warum funktioniert das nicht, wenn ich das Tupel ohne Fehler so extrahieren kann?

Antwort

4

Ich versuche immer noch, alles in den Griff zu bekommen, aber es scheint wie korrektes Verhalten.

Sollte delegate null sein, würden Sie nil myTuple zuweisen, so müssen Sie myTuple optional auch ...

class SMCalculator: NSObject { 

    var delegate : SMCalculatorDelegate? 

    func add() { 

     let myTuple : (n1: Int, n2: Int)? = delegate?.numbersToAdd() 

     // this works, because we're saying that myTuple definitely isn't nil 
     println(myTuple!.n1) 

     // this works because we check the optional value 
     if let n1 = myTuple?.n1 { 
      println(n1) 
     } else { 
      println("damn, it's nil!") 
     } 

     // doesn't work because you're trying to access the value of an optional structure 
     println(myTuple.n1) 

    } 

} 

Werke für mich

+0

Sie sind richtig, dies beseitigt die Build-Fehler machen und die Logik macht Sinn ... Ich habe aber immer noch Probleme beim Zugriff auf die einzelnen Werte des Tupels. Wenn ich die Dokumente richtig gelesen habe, dann sollte ich * einfach * in der Lage sein, 'println (meinTuple.n1)' zu gehen, aber das erhöht den Fehler '' (n1: Int, n2: Int)? ' hat kein Member namens 'n1'' – Sammio2

+0

Ich habe meine Lösung aktualisiert, um zu zeigen, wie man auf optionale Variablen zugreift. Weil sie umsonst sind, müssen Sie das '!' Operator, um sie auszupacken, was dem Compiler sagt, dass Sie sicher sind, dass der Wert zu diesem Zeitpunkt im Code nie Null ist, oder Sie verwenden die If-Struktur, um den Fall zu erfassen, dass der Wert null ist. – Jann

+1

Oh ja natürlich !! Da das Tupel optional ist, sind dies auch die Werte innerhalb des Tupels. Danke für Ihre Hilfe! Mein Gehirn ist am Ende einer langen Woche gebraten! – Sammio2

Verwandte Themen